繁体   English   中英

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

[英]Passing logged in user credentials to Powershell cmdlet

我在Windows 2012 Server上运行Windows服务(服务以“ NT AUTHORITY \\ SYSTEM”运行)。 该服务需要从远程计算机获取虚拟机列表。 它执行与“ 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#代码中传递登录用户(管理员)的凭据,以便可以从C#代码成功调用get-vm cmdlet?

您可以使用Invoke-Command并使用admin凭据创建一个临时会话来以足够的特权调用您的命令,或者,如果您需要运行多个命令,则可以使用admin凭据创建一个远程运行空间并在其中执行命令运行空间。 这将需要配置并运行WinRM服务。

您可以采取的另一种选择是,以管理员用户或具有足够特权而不是NT AUTHORITY \\ SYSTEM的专用帐户的身份运行服务。 这样,您就不会将管理凭据与代码不安全地存储在一起,也不会为硬编码凭据造成其他后果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM