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

12

我有以下的C#代码

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

这给了我一个异常。

访问注册表键'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell'被拒绝。

根据这里的说明,解决方案是以管理员身份启动PowerShell。

通常情况下,可以通过右键单击PowerShell并选择“以管理员身份运行”来实现。有没有一种以编程方式实现这个目的的方法呢?

5个回答

7

我知道这是一篇旧帖子,但我们最近遇到了同样的问题。

我们不得不通过从PowerShell运行以下命令来限定运行C#代码的机器的执行策略...

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted

之前我们曾经这样做,没有进行作用域限制,我们设置了管理员的执行策略。而Visual Studio\ C#正在以当前用户身份运行,导致权限不足而失败。


3

看一下这个

你需要模拟管理员来完成它(当然需要管理员凭据)。

查看那篇文章,它还附带了可直接使用的代码(我已经使用过它,它非常好用)。

基本上,你需要这样做:

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

这在我的Windows Server 2012和PowerShell 3.0上不起作用。 :( - Anonymous
8
我很惊讶原帖的作者将这个答案标记为最佳答案。问题中提到“右键单击 PowerShell 并选择 '以管理员身份运行'”,这意味着他正在使用的凭据已经是管理员组的成员,但是被微软添加的名为 UAC 的绝妙安全措施阻止了他们。所发表的解决方案并未解决这个问题。部分人认为应该将此帖子标记为不好的答案,因为它没有解决所发布的问题...... - Jason
这是来自代码项目的非常老的代码。2005年的。它在Windows 2012中不会起作用。我必须找到一些方法将其转换为64位。 - Nathan McKaskle

2

管理权限是在应用程序级别上的。在这种情况下需要管理员访问的应用程序是你自己的应用程序。在 C# 中创建运行空间并不会调用 Powershell 应用程序,它只是将一些程序集加载到你的应用程序中。

也就是说,你可以像其他人所说的那样提升权限,尽管将管理员用户名和密码嵌入源代码让我感到不适。

-Oisin


3
不必深入源代码,我的片段只是一个示例。 - juan

0

我认为另一种模式是将PowerShell执行器封装成一个简单的ASP.NET WebAPI Web服务。

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

要执行脚本,只需调用Web服务方法即可。您可以使方法相当通用-脚本名称和参数。

这需要更多的工作,但更加安全(请参见x0n的想法)。


这更像是一种黑客行为,而不是替代方法。仅仅因为你能做到并不意味着你应该这样做。 - spicy.dll

0

仅适用于DEV环境 这是一个相对很旧的帖子。 但我找到了一种新的方法来做到这一点。 我正在使用IIS 8托管C# Web API,并具有一些我想要以管理员权限运行的PowerShell代码。

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

IIS8 on Windows 2012 server

只需在应用程序池标识中设置管理员帐户。

希望这对任何人有所帮助。 :)


1
始终避免这种情况,因为这是严重的安全漏洞。 - gdbdable
把凭证硬编码在代码里不如使用其他方式更好... :) @devi - 你再考虑一下吧 - Omkar Telee
不同意,将IIS池作为本地管理员运行是非常糟糕的想法,没有什么比这更糟糕的了,即使是硬编码也不行。一般情况下,在Web应用程序中以本地管理员身份运行某些内容的要求是设计不良的信号。 - gdbdable
在开发机器上这样做没问题,但在生产机器上就不太好了。 - Soleil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接