Topshelfを使用してC#で書かれたWindowsサービスがあります。ユーザーがログインしていないとサービスからのProcessStartInfoが機能しない
私は、管理者として実行する必要があるPowershellスクリプトを開始したいと思います。
var workingDirectory = Path.GetDirectoryName(psScriptPath) ?? Environment.CurrentDirectory;
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = @"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe",
Arguments = string.Format("-ExecutionPolicy Bypass -File \"{0}\"", psScriptPath),
WindowStyle = ProcessWindowStyle.Normal,
WorkingDirectory = workingDirectory,
Verb = runAsAdmin ? "runas" : null,
UseShellExecute = true,
CreateNoWindow = false
}
};
process.Start();
サービスは管理者アカウントとして実行されています。
ここでは、奇妙なことがあります。新しいマシンでサービスが実行されていて、上のコードを起動すると、何も起こりません。例外はスローされず、スクリプトは実行されないように見えます(Powershell Transcriptコマンドを使用し、ログファイルは作成されません)。
しかし、私がマシンにログインしていて、同じコードがトリガーされた場合、コードは正常に実行されます。
ファイルのアクセス許可、LoadUserProfile = true、UACを無効にする(レジストリ内でさえも)何も問題なく動作していると思われるすべてを試しました。マシンにログインすることができないため、何が起こっているかを知る他の方法は考えられません。
誰でもいいですね。
"runas" Verb(adminとして実行するため)を実行するには、シェルexecuteを使用する必要があります。シェル実行を使用する場合は、非表示のウィンドウを実行できません。 – samjudson
だからこそ私は代わりの解決策を求めている。また、管理者権限レベルのアカウントとしてサービスユーザーを設定できる必要があります。特定の構成では、「実行する」ことを念頭において、無人サービスのために必要な動作を壊す資格情報を入力する必要があります。 – toadflakz
サービスは管理者として実行されていますが、スクリプトが明示的に昇格されていない場合は、(レジストリアクセス要件のために)失敗します。ユーザーがログインしたときにUIが表示されたり、同意を必要とせずに動作していることがわかります。 – samjudson