偽装を使用して MVC 3 コントローラーから Powershell コマンドレットを実行しようとしていますが、「要求されたレジストリ アクセスは許可されていません」というメッセージが表示され続けます。Runspace.Open() 呼び出し時の例外
StringBuilder stringBuilder = new StringBuilder();
RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();
using (new Impersonator("username", "domain", "password"))
{
Runspace runspace = RunspaceFactory.CreateRunspace(rsConfig);
runspace.Open();
Pipeline pipeLine = runspace.CreatePipeline();
string script = "get-process";
pipeLine.Commands.AddScript(script);
Collection<PSObject> commandResults = pipeLine.Invoke();
foreach (PSObject obj in commandResults)
{
stringBuilder.AppendLine(obj.Properties["ProcessName"].Value.ToString());
}
デバッグは、HKCU\Environment でレジストリ キーの読み取りが試行されたため、レジストリ エラーが発生したことを示しています。偽装なしで上記を実行すると、正常に機能します。
注: 偽装クラスは次の場所にあります: http://platinumdogs.wordpress.com/2008/10/30/net-c-impersonation-with-network-credentials/
なぜこれが起こっているのか、それを解決するために何ができるのかについてのアイデアはありますか?
アップデート:
少し睡眠を取った後、Runspace.Open() を偽装行の上に移動すると、実行空間が必要なレジストリ データ (環境変数) にアクセスできるようになり、これが実際に役立ちました。
これで、コードは組み込みのコマンドレットで正常に動作しますが、「Microsoft.Exchange.Management.PowerShell.Admin」をロードして Exchange コマンドレットのいずれかを試すと、アプリケーションがクラッシュします。