![タスク スケジューラ プログラムは、%LOCALAPPDATA% という名前のリテラル フォルダーに書き込みます。](https://rvso.com/image/1415040/%E3%82%BF%E3%82%B9%E3%82%AF%20%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%A9%20%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AF%E3%80%81%25LOCALAPPDATA%25%20%E3%81%A8%E3%81%84%E3%81%86%E5%90%8D%E5%89%8D%E3%81%AE%E3%83%AA%E3%83%86%E3%83%A9%E3%83%AB%20%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%81%AB%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E3%81%BE%E3%81%99%E3%80%82.png)
私はMicrosoftの.NET実行ファイル(私が作成したもの)を持っています。Active Directory サービス インターフェイス(System.DirectoryServices.AccountManagement経由) LDAPクエリを実行します。ADSI内部では、Active Directoryスキーマをダウンロードしてローカルに保存しますこのスキーマは のフォルダーに保存されるはずです%LOCALAPPDATA%\Microsoft\Windows\SchCache\
。
この実行ファイルをスケジュールするとタスクスケジューラWindows Server 2012 R2で「UserA」として実行するように設定するたとえそのユーザーがログインしていなくてもプログラムは実行されますが、上記のキャッシュファイルを文字通りの名前のフォルダ%LOCALAPPDATA%\Microsoft\Windows\SchCache\
以内で開始スケジュールされたタスクのフォルダー (これは意図的に実行可能ファイルのフォルダーに設定されています)。つまり、 のようなものに書き込んでいますC:\MyApp\%LOCALAPPDATA%\Microsoft\Windows\SchCache\
。プログラムを適切に実行できるようにするには、UserA にこのフォルダーへの明示的な書き込み権限を与える必要がありました。
Process Monitor でタスクのプロセスを監視しましたが、すぐにそのフォルダーに移動しています。最初に何かを試したが失敗したというわけではありませんC:\Users\
。
自分のユーザーとしてサーバーにログインし、UserAとして手動で実行ファイルを実行すると、別のユーザーとして実行する実行可能ファイルが実行され、キャッシュ ファイルが に正常に書き込まれますC:\Users\UserA\AppData\Local\Microsoft\Windows\SchCache\
。
タスクスケジューラでなぜこのようなことが起こるのでしょうか。また、これを修正するにはどうすればいいでしょうか。タスクスケジューラがUserAのコンテキストでプログラムを実行しているが、%LOCALAPPDATA%
環境変数として初期化していないことが原因ではないかと考えています。思いつきで設定してみました。最高権限で実行するタスクに集中しましたが、結果は変わりませんでした。
答え1
これはWindows Server 2012 R2および8.1のバグです。Microsoftはこれを文書化しています。KB 2968540。
問題は修正され、修正プログラムがリリースされましたKB3133689 翻訳が利用可能です。この修正プログラムにより問題は解決されます。
UBPM を使用して実行されるスケジュールされたタスクには、対応するプロセスが開始されたときに、APPDATA、USERPROFILE、TEMP などの十分な環境変数がありません。
答え2
Windows 7 / 2012 のスケジュールされたタスクにバグがあり、実行しているユーザーの正しい環境変数が認識されないと思われます。
https://stackoverflow.com/questions/32589381/
SET>test.txt
これが起こっていることを確認するには、同じユーザーコンテキストでスケジュールされたタスクのバッチファイルを実行することができます。これを試してみると、ない指定されたユーザーの環境変数の正しい完全なセットを表示します。つまり、実際にそのユーザーとしてログインして同じコマンド(またはバッチファイル)を実行した場合に表示されるセットとは異なります。(さらに混乱を招くのは、スケジュールされたタスクの実行時にユーザーが現在ログインしているかどうかによってこれが変わることです。ユーザーがログインしている場合、タスクはする正しい変数を参照してください。
この動作は文書化されておらず、意図もされていないと思いますが、これは Windows Server 2012 (おそらく R2 のみ?) のスケジュールされたタスクの処理方法におけるバグです。
注意これはPATH
変数にも適用されるため、スケジュールされたタスクは、デフォルトパス、現在のディレクトリ、または完全に指定されたパスで呼び出します。指定されたユーザーのパス上にあるが、デフォルトのパス上にないものを呼び出すと、デバッグが困難なエラーが発生します (テストでは動作するため)。
答え3
これは、Windows がユーザー アカウントを処理する方法の結果です。ユーザー アカウントがログインしていない場合、そのユーザー レジストリ ハイブ (HKEY_USERS
通常はその下のキーが としてマップされますHKEY_CURRENT_USER
) はマウントされません。そのハイブ (各ユーザーのプロファイル内の と呼ばれるファイルに保存されますNTUSER.DAT
) には、ユーザーごとの環境変数を含む、ほぼすべてのユーザーごとのデータが格納されます。Windows にはシステム環境変数もあります。PATH などの一部の変数は両方の場所に存在し、マージされるため、ユーザーのレジストリ ハイブがマウントされていなくても、それらの変数が表示されます。ただし、ユーザー固有のものは表示されません。
他のWindowsバージョンではタスクスケジューラがこのシナリオを異なる方法で処理したかどうかはわかりません。できたそのユーザーとしてタスクを実行する前に、そのユーザーのハイブをマウントできるほどスマートである必要があります。Win7 / 2012R2 では、明らかにそうではありません。
これを修正するには、ユーザーのレジストリハイブがマウントされていることを確認する必要があります。これを行う最も簡単な方法は、ユーザーがログインしていることを確認することです。ログインしているユーザーのハイブは常にマウントされているからです。それができない場合は、自分でハイブをマウントしてみてください(APIはRegLoadKey
しかし、私はこれのためにそれを呼び出すことを試みたことはありません。