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

本文关键字:Powershell cmdlet 登录 用户 | 更新日期: 2023-09-27 18:09:33

我在Windows 2012服务器上运行Windows服务(服务以"NT AUTHORITY'SYSTEM"运行)。此服务需要从远程机器获取虚拟机列表。它执行等价于"get-vm -ComputerSystem RemoteServer1"的cmd命令。当前登录的用户是"Administrator",可以在远程机器上调用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:您没有执行该操作的权限。如果您认为自己应该有执行此操作的权限,请与管理员联系。——>系统。UnauthorizedAccessException:拒绝访问。(Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

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

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

您可以使用 invoke - command 创建一个带有admin权限的临时会话来调用具有足够权限的命令,或者,如果您需要运行多个命令,您可以使用admin权限创建一个远程运行空间,并在该运行空间中执行命令。这将需要WinRM服务配置和运行。

你的另一个选择,我会走那条路,是在admin用户或具有足够特权的专用帐户的身份下运行服务,而不是NT AUTHORITY'SYSTEM。这样,您就不会将管理标识与代码一起不安全地存储,而不会命名硬编码标识的其他后果。