CreateProcessAsUser()を使用してスクリプトと実行可能ファイルを実行することにより、いくつかの自動化タスクを処理するサードパーティのWindowsサービスを使用しています。UACと、APIを介したLUAの昇格の処理方法が原因で、WindowsServer2008で問題が発生しています。
このサービスはLocalSystemとして実行され、「デスクトップとの対話」が有効になっていません。プロセスはAdministratorsグループのユーザーとして実行されていますが、Administratorアカウント(多くのUAC制限から免除されています)では実行されていません。すべてのUACデフォルト設定が設定されています。
任意のコマンドまたはPowerShellコードをサービスに渡すことはできますが、サービスによって開始される、昇格されていない非対話型のプロセスから「抜け出す」ことができないようです。
問題の核心は、昇格されたプロセスを開始するための唯一の(パブリック)APIオプションが'runas'動詞を持つShellExecute()であるようですが、私が知る限り、非対話型から呼び出すことはできませんサービスを実行しないか、「この操作にはインタラクティブウィンドウステーションが必要です」などのエラーが発生します。
私が見つけた唯一の回避策はここに記載されています: http ://www.eggheadcafe.com/software/aspnet/29620442/how-to-proper-use-sendinp.aspx
Vistaでは、プロセスを昇格させるための公式に文書化された方法は、シェルAPI ShellExecute(Ex)のみを使用することです(CreateProcessまたはCreateProcessAsUserではありません)。したがって、アプリケーションはShellExecute(Ex)を呼び出して、SendInputを呼び出すために昇格されたヘルパーを起動する必要があります。さらに、セッション0の分離により、サービスはCreateProcessAsUserまたはCreateProcessWithLogonW(ShellExecute(Ex)は使用できません)のみを使用してインタラクティブデスクトップを指定できます。
..Windowsサービスから昇格されたプロセスを生成する直接的な方法はないと思います。最初にCreateProcessAsUserまたはCreateProcessWithLogonWを使用して、昇格されていないプロセスをユーザーセッション(インタラクティブデスクトップ)に生成することしかできません。次に、昇格されていないプロセスで、ShellExecute(Ex)を使用して、実際のタスクの昇格されたプロセスを生成する場合があります。
.net / powershellコードからこれを行うには、.Net System.Diagnostics.ProcessStartInfoに同等のlpDesktopがないため、CreateProcessAsUserまたはCreateProcessWithLogonWを呼び出すために複雑なP/Invokeを実行する必要があるようです。 「winsta0\default」に設定します。また、LocalSystemにCreateProcessAsUserまたはCreateProcessWithLogonWを呼び出す権限があるかどうかもわかりません。
また、 http://blogs.msdn.com/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessasuser-in-net.aspx と Processを確認しました。
これらすべてに基づいて、これを行う簡単な方法はないという結論に達しました。私は何かが足りないのですか?これは本当に難しいことではないようです。UACは、非対話型のユースケースを処理するように設計されたことがないように感じます。
そして、Microsoftの人がこれを読んでしまった場合、ShellExecuteが内部で昇格を処理する方法は、Application Information Service(AIS)を呼び出すことであることに気付きました。Win32または.NETAPIを介してAISへの同じ呼び出しを利用できないのはなぜですか? http://msdn.microsoft.com/en-us/library/bb756945.aspx
少し時間がかかってすみません。アイデアをありがとう。