Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将登录的用户凭据传递到Powershell cmdlet_C#_.net_Powershell_Windows Server 2012 - Fatal编程技术网

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

C# 将登录的用户凭据传递到Powershell cmdlet,c#,.net,powershell,windows-server-2012,C#,.net,Powershell,Windows Server 2012,我有一个Windows服务正在Windows 2012服务器上运行(服务以“NT AUTHORITY\SYSTEM”的形式运行)。此服务需要从远程计算机获取虚拟机列表。它执行相当于“get-vm-ComputerSystem RemoteServer1”的cmdlet。当前登录的用户是“管理员”,有权在远程计算机上调用get vm。但是,“NT AUTHORITY\SYSTEM”没有在远程计算机上调用get vm的权限。下面是代码 PowerShell psStopVM = PowerShell

我有一个Windows服务正在Windows 2012服务器上运行(服务以“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_访问被拒绝))


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

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


您可以选择另一种方式(我也可以选择这种方式),即以管理员用户的身份或具有足够权限的专用帐户(而不是NT AUTHORITY\SYSTEM)运行服务。这样,您就不会不安全地使用代码存储管理凭据,也不会命名硬编码凭据的其他后果。

您必须使用,这是Brock,我不想被提示输入密码。我想无缝地传递当前登录用户的凭据。您没有提到这一点,但有没有理由不以管理员身份运行该服务?这是不是Active Directory域?Tim-我认为没有任何理由。但我不想以管理员的身份运行它,因为它可能会导致其他不相关的问题(这是一项大型服务)。Brock-用户可以将此系统添加到域中。