6

PowerShell と C# で偽装を実行すると、やや奇妙なエラーが発生します。次のコードを実行しても、エラーは表示されません。

PSObject result = null;
using (PowerShell powershell = PowerShell.Create())
{
    RunspaceConfiguration config = RunspaceConfiguration.Create();
    powershell.Runspace = RunspaceFactory.CreateRunspace(config);
    powershell.Runspace.Open();
    powershell.AddScript(String.Format(CmdletMap[PSVocab.OsBootTime],
                         this.ComputerName));
    result = powershell.Invoke().First();
    powershell.Runspace.Close();
}

return DateTime.Parse(result.ToString());

PSスクリプトCmdletMap[PSVocab.OsBootTime]は単純です:

$info = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $computer
        ; $info.ConvertToDateTime($info.LastBootUpTime)

上記の C# コードはローカルで正常に動作します。ただし、次のように Windows の偽装で同じブロックを作成すると、次のようになります。

WindowsIdentity ImpersonatedIdentity = new WindowsIdentity(ImpersonateUserName);
WindowsImpersonationContext impersonatedContext
    = ImpersonatedIdentity.Impersonate();
try
{
PSObject result = null;
using (PowerShell powershell = PowerShell.Create())
{
    RunspaceConfiguration config = RunspaceConfiguration.Create();
    powershell.Runspace = RunspaceFactory.CreateRunspace(config);
    powershell.Runspace.Open();
    powershell.AddScript(String.Format(CmdletMap[PSVocab.OsBootTime],
                             this.ComputerName));
    result = powershell.Invoke().First();
    powershell.Runspace.Close();
}

return DateTime.Parse(result.ToString());
} catch (Exception ex) { // do logging here } 

次の例外が発生します。

FileNotFoundException: C:\Windows\assembly\GAC_MSIL\System.Management.Automation\1.0.0.0__31bf3856ad364e35\System.Management.Automation.dll

デバッグは、で失敗したことを示していますRunspaceConfiguration.Create()。理由はわかりませんが。

ただし、DLL は既に GAC に登録されており、プロジェクト自体で参照されています。また、パスとバージョンが正しいことも確認しました。

参照元:

誰かがこれに洞察を与えることができますか?

4

1 に答える 1

0

なりすましているユーザーには、GAC で必要な PowerShell ファイルにアクセスするための十分な権限がない可能性があります。

クイック ショットとして、ユーザー (なりすましている) にローカル管理者権限を与えて、それが機能するかどうかを確認してください。これが機能する場合は、ローカル管理者権限を取り消し、必要に応じてファイル権限を追加してください。

于 2011-07-22T07:08:10.980 に答える