it-swarm-ja.com

タスクスケジューラプログラムは、%LOCALAPPDATA%という名前のリテラルフォルダに書き込みます

Microsoftの Active Directoryサービスインターフェイス (System.DirectoryServices.AccountManagement経由)を使用してLDAPクエリを実行する.NET実行可能ファイル(作成したもの)があります。 ADSIの内部では、 Active Directoryスキーマをダウンロードしてローカルに保存します 。このスキーマは%LOCALAPPDATA%\Microsoft\Windows\SchCache\のフォルダに保存することになっています。

この実行可能ファイルをWindowsServer 2012R2のタスクスケジューラでスケジュールし、「UserA」として実行するように設定するとそのユーザーがログインしていなくても、プログラムは実行されますが、上記のキャッシュファイルをスケジュールされたタスクの start-in フォルダー内の文字通り%LOCALAPPDATA%\Microsoft\Windows\SchCache\という名前のフォルダーに書き込もうとします(これは意図的に実行可能ファイルのフォルダに設定されています)。つまり、C:\MyApp\%LOCALAPPDATA%\Microsoft\Windows\SchCache\のようなものに書き込んでいます。プログラムを正しく実行するには、このフォルダーへの明示的な書き込み権限をUserAに付与する必要がありました。

プロセスモニターでタスクのプロセスを監視しましたが、すぐにそのフォルダーに移動します。最初にC:\Users\で何かを試みたが、失敗したわけではありません。

自分のユーザーとしてサーバーにログインし、別のユーザーとして実行を使用して実行可能ファイルをUserAとして手動で実行すると、実行可能ファイルが実行され、キャッシュファイルがC:\Users\UserA\AppData\Local\Microsoft\Windows\SchCache\に正常に書き込まれます。

これがタスクスケジューラで発生するのはなぜですか?それを修正するにはどうすればよいですか?タスクスケジューラがUserAのコンテキストでプログラムを実行しているが、環境変数として%LOCALAPPDATA%を初期化していないことに関係しているのではないかと思います。気まぐれで、タスクに最高の特権で実行を設定しようとしましたが、結果は変わりませんでした。

4
Luke Z

これは、Windows Server 2012R2および8.1のバグです。 Microsoftはそれを KB 296854 に文書化しています。

問題が修正され、ホットフィックス KB 3133689 が利用可能になりました。この修正プログラムは問題を解決します。

UBPMを使用して実行されるスケジュールされたタスクには、対応するプロセスの開始時にAPPDATA、USERPROFILE、TEMPなどの十分な環境変数がありません。

0
Luke Z

これは、Windowsがユーザーアカウントを処理する方法の結果です。ユーザーアカウントがログインしていない場合、ユーザーレジストリHive(通常はHKEY_USERSとしてマップされるHKEY_CURRENT_USERの下のキー)はマウントされません。そのハイブ(NTUSER.DATと呼ばれる各ユーザーのプロファイルのファイルに保存されます)は、ユーザーごとの環境変数を含む、ほぼすべてのユーザーごとのデータを保存します。 Windowsにはシステム環境変数もあります(PATHなどの一部の変数は両方の場所に存在し、マージされます)。そのため、ユーザーのレジストリHiveがマウントされていなくてもそれらは表示されます。ただし、ユーザー固有のものはありません。

タスクスケジューラが他のWindowsバージョンでこのシナリオを異なる方法で処理したかどうかはわかりません。 couldは、そのユーザーとしてタスクを実行する前に、ユーザーのHiveをマウントするのに十分賢いです。 Win7/2012R2では、明らかにそうではありません。

これを修正するには、ユーザーのレジストリHiveがマウントされていることを確認する必要があります。これを行う最も簡単な方法は、ログインしているユーザーのHiveが常にマウントされているため、ユーザーがログインしていることを確認することです。それがない場合は、自分でHiveをマウントしてみることができます(APIは RegLoadKey ですが、これを呼び出すことは試したことがありません)。

0
CBHacking

Windows 7/2012のスケジュールされたタスクにはバグがあるため、実行しているユーザーの正しい環境変数が次のように表示されないと思います。

https://stackoverflow.com/questions/32589381/

これが発生していることを確認するには、同じユーザーコンテキストで、スケジュールされたタスクのバッチファイルでSET>test.txtを実行できます。これを試してみると、notは、指定されたユーザーの環境変数の正しい完全なセットを表示しません。つまり、そのユーザーとして実際にログインしたときに同じコマンド(またはバッチファイル)を実行した場合に表示されるセットとは異なります。 (さらに紛らわしいことに、これは、スケジュールされたタスクの実行時にユーザーが現在ログインしているかどうかによって異なります。ユーザーがログインしている場合、タスクは正しい変数を参照します。 )

この動作は文書化も意図もされておらず、Windows Server 2012(おそらくR2だけ?)のスケジュールされたタスクの処理方法のバグだと思います。

[〜#〜] nb [〜#〜]これはPATH変数にも適用されるため、スケジュールされたタスクは実行可能ファイルのみを表示できます。 defaultパス上、現在のディレクトリ、または完全に指定されたパス上にあります。指定されたユーザーのパス上にあるがデフォルトパス上にはないものを呼び出すと、デバッグが困難なエラーが発生します(テストで機能するためです!)。

0
MikeBeaton