从C#以管理员身份执行PowerShell

我有以下C#代码

using (RunspaceInvoke invoker = new RunspaceInvoke()) { invoker.Invoke("Set-ExecutionPolicy Unrestricted"); // ... } 

这给了我一个例外

访问注册表项“HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PowerShell \ 1 \ ShellIds \ Microsoft.PowerShell”被拒绝。

据此,解决方案是以管理员身份启动PowerShell。

通常,可以通过右键单击PowerShell并选择“以管理员身份运行”来完成此操作。 有没有办法以编程方式执行此操作?

看看这个

您需要以管理员身份进行模拟(您当然需要管理员凭据)

检查那篇文章,它还附带了可以使用的代码(我已经使用过它并且效果很好)

基本上,你需要这样做:

 using ( new Impersonator( "myUsername", "myDomainname", "myPassword" ) ) { using (RunspaceInvoke invoker = new RunspaceInvoke()) { invoker.Invoke("Set-ExecutionPolicy Unrestricted"); } } 

我知道这是一个老post,但我们最近遇到了同样的问题。

我们必须通过从PowerShell运行以下内容来在运行C#代码的机器上确定执行策略的范围…

 Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted 

当我们之前完成此操作而没有确定范围时,我们正在为管理员设置执行策略。 Visual Studio \ C#作为当前用户运行,导致其失败且权限不足。

管理权限在应用程序级别。 在这种情况下需要管理员访问权限的应用程序是您的 。 在自定义应用程序中使用C#创建运行空间不会调用应用程序的powershell – 它只是将一些程序集加载到您的应用程序中。

也就是说,你可以像其他海报所说的那样提升,尽管将管理员用户名和密码嵌入到源代码中会让我感到恶心。

-Oisin

我认为另一种模式是将powershell执行器包装成一个简单的asp.net webapi webservice。

然后,可以将Web服务配置为使用执行此任务所需的权限运行。 它可以提供自己的安全性来确定哪些客户端可以调用它。

要执行脚本,只需调用webservice方法即可。 您可以使该方法非常通用 – 脚本名称和参数。

这是一项更多的工作,但更安全(参见x0n的想法)。

严格的DEV环境这是相对很老的post。 但我找到了一种新方法。 我在IIS 8上托管C#web api,其中包含一些我想以管理员权限运行的powershell代码。

所以我在应用程序池标识设置中提供了管理员凭据。

Windows 2012服务器上的IIS8

只需在应用池标识中设置管理员帐户即可

希望这对任何人都有帮助。 🙂