我有以下C#代码
using (RunspaceInvoke invoker = new RunspaceInvoke())
{
invoker.Invoke("Set-ExecutionPolicy Unrestricted");
// ...
}
给了我例外
访问注册表项 'HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的PowerShell \ 1 \ ShellIds \ Microsoft.PowerShell' 被拒绝。
根据this,解决方案是以管理员身份启动PowerShell。
通常,可以通过右键单击PowerShell并选择“以管理员身份运行”来完成此操作。有没有办法以编程方式执行此操作?
答案 0 :(得分:5)
检查this
您需要以管理员身份进行模拟(您当然需要管理员凭据)
检查那篇文章,该代码还随附代码(我已经使用过它并且效果很好)
基本上,你需要这样做:
using ( new Impersonator( "myUsername", "myDomainname", "myPassword" ) )
{
using (RunspaceInvoke invoker = new RunspaceInvoke())
{
invoker.Invoke("Set-ExecutionPolicy Unrestricted");
}
}
答案 1 :(得分:4)
我知道这是一篇旧帖子,但最近我们遇到了同样的问题。
我们必须通过在PowerShell中运行以下内容来在运行C#代码的计算机上确定执行策略的范围...
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted
当我们之前完成此操作而没有确定范围时,我们正在为Administrator设置执行策略。 Visual Studio \ C#作为当前用户运行,导致其失败且权限不足。
答案 2 :(得分:2)
管理权限位于应用程序级别。在这种情况下需要管理员访问权限的应用是你的。在自定义应用程序中使用C#创建运行空间不会调用应用程序的powershell - 它只是将一些程序集加载到您的应用程序中。
也就是说,你可以像其他海报所说的那样提升,虽然将管理员用户名和密码嵌入源代码会让我感到不适。
-Oisin
答案 3 :(得分:0)
我认为另一种模式是将powershell执行器包装到一个简单的asp.net webapi webservice中。
然后,可以将Web服务配置为使用执行此任务所需的必需权限运行。它可以提供自己的安全性来确定哪些客户端可以调用它。
要执行脚本,您只需调用webservice方法即可。你可以使方法非常通用 - 脚本名称和参数。
这是一项更多的工作,但更安全(参见x0n的想法)。
答案 4 :(得分:-1)