将登录的用户凭据传递给Powershell cmdlet

时间:2014-06-21 06:35:09

标签: c# .net powershell windows-server-2012

我在Windows 2012 Server上运行了Windows服务(服务正在" NT AUTHORITY \ SYSTEM")。此服务需要从远程计算机获取VM列表。它执行相当于" get-vm -ComputerSystem RemoteServer1"的cmdlet。目前登录的用户是'管理员'谁有权访问远程计算机上的get-vm。然而," NT AUTHORITY \ SYSTEM"没有权限在远程计算机上调用get-vm。以下是代码。

PowerShell psStopVM = PowerShell.Create();
psStopVM.AddCommand("Stop-VM");
psStopVM.AddParameter("Name", vmName);
psStopVM.AddParameter("ComputerName", VMHost);
psStopVM.AddParameter("Force", true);

psStopVM.Invoke(); //exception occurs here

当我运行此代码时,出现以下错误。 Microsoft.HyperV.PowerShell.VirtualizationOperationFailedException:您无权执行此操作。如果您认为自己应该有权执行此操作,请与您的管理员联系。 ---> System.UnauthorizedAccessException:拒绝访问。 (HRESULT异常:0x80070005(E_ACCESSDENIED))

如何在C#代码中传递登录用户(Administrator)的凭据,以便我可以从C#代码成功调用get-vm cmdlet?

1 个答案:

答案 0 :(得分:0)

您可以使用 Invoke-Command 并使用admin creds创建一个ad hoc会话,以使用足够的权限调用您的命令,或者,如果您需要运行多个命令,则可以创建一个远程使用管理员凭据运行空间并在该运行空间中执行命令。这将需要配置并运行WinRM服务。

你还有其他选择,我会去那条路线,就是在管理员用户的身份下运行服务,或者使用具有足够权限的专用帐户而不是NT AUTHORITY \ SYSTEM。这样,您就不会将您的管理员信用卡不安全地存储在您的代码中,而不是命名硬编码信用卡的其他后果。