请求的注册表访问不被允许.当试图在远程机器上使用模拟运行PowerShell脚本时
本文关键字:机器 脚本 PowerShell 运行 模拟 程机器 访问 注册表 请求 | 更新日期: 2023-09-27 17:53:20
这是我第一次尝试从c#应用程序中执行PowerShell脚本。我正在使用PowerShell,因为我需要我在远程机器上执行的。exe的输出。我可以使用WMI在远程机器上运行。exe,但是我无法得到我需要的输出。
无论如何,我在过去的一天左右一直在做这件事,我已经在网上和这里看了类似的问题,但似乎无法找出问题所在。我正试图从我的。net 4.0应用程序在远程机器上运行一个简单的PowerShell命令。当我以管理员身份运行Visual Studio 2013时,以下代码执行良好:
PowerShell ps = PowerShell.Create();
ps.AddScript(@"Invoke-Command {c:'path'to'file.exe /p} -computername <computerName>");
results = ps.Invoke();
我得到预期的结果。然而,当我以非管理员的身份运行VS时,代码似乎执行得很好(没有异常),但我没有得到任何结果。环顾四周之后,我添加了如下的模拟:
using (var impersonator = new Impersonator("username", "domain", "password"))
{
PowerShell ps = PowerShell.Create();
ps.AddScript(@"Invoke-Command {c:'path'to'file.exe /p} -computername <computerName>");
results = ps.Invoke();
}
然而,ps.Invoke方法开始抛出System.Security.SecurityException - "请求的注册表访问是不允许的。"下面是堆栈跟踪:
在Microsoft.Win32.RegistryKey。OpenSubKey(字符串名称,布尔可写)在System.Environment。gettenvironmentvariable(字符串变量,EnvironmentVariableTarget目标)在System.Management.Automation.ModuleIntrinsics。GetExpandedEnvironmentVariable(字符串名称,EnvironmentVariableTarget目标)在System.Management.Automation.ModuleIntrinsics.SetModulePath ()在System.Management.Automation.ModuleIntrinsics . .男星(ExecutionContext上下文)在System.Management.Automation.ExecutionContext。InitializeCommon(AutomationEngine引擎,PSHost hostInterface)在System.Management.Automation.ExecutionContext . .(AutomationEngine引擎,PSHost主机接口,RunspaceConfiguration, RunspaceConfiguration)在System.Management.Automation.AutomationEngine . .(PSHost hostInterface, RunspaceConfiguration, InitialSessionState iss)在System.Management.Automation.Runspaces.LocalRunspace.DoOpenHelper ()在System.Management.Automation.Runspaces.LocalRunspace。OpenHelper(布尔syncCall)在System.Management.Automation.Runspaces.RunspaceBase。CoreOpen(布尔syncCall)在System.Management.Automation.Runspaces.RunspaceBase.Open ()在System.Management.Automation.PowerShell.Worker。creataterunspaceifneeddedanddowork (Runspace rsToUse, Boolean isSync)在System.Management.Automation.PowerShell。CoreInvokeHelper[input,TOutput](PSDataCollection
1 input, PSDataCollection
1输出,PSInvocationSettings设置)在System.Management.Automation.PowerShell。CoreInvoke[input,TOutput](PSDataCollection1 input, PSDataCollection
1输出,PSInvocationSettings设置)在System.Management.Automation.PowerShell。CoreInvoke[TOutput](IEnumerable输入,PSDataCollection ' 1输出,PSInvocationSettings设置)在System.Management.Automation.PowerShell。调用(IEnumerable输入,PSInvocationSettings设置)在System.Management.Automation.PowerShell.Invoke ()
我不知道为什么当我运行的管理员帐户访问注册表时,我得到了SecurityException,不仅在我的机器上,而且在整个企业的机器上。我甚至不确定它在哪个注册表上得到异常,我的机器还是远程机器
在模拟之前为PowerShell对象创建底层RunSpace:
PowerShell ps = PowerShell.Create();
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
powerShell.Runspace = runspace;
using (var impersonator = new Impersonator("username", "domain", "password"))
{
ps.AddScript(@"Invoke-Command {c:'path'to'file.exe /p} -computername <computerName>");
results = ps.Invoke();
}
runspace.Close()
RunSpace对象封装了用于脚本执行的操作系统环境。被访问的密钥可能是HKCU'Environment。这就是我在使用Perfmon时看到的。RunSpace可能使用HKCU'Environment来填充变量,例如$PATH。
因此,当创建RunSpace时,您希望它是当前用户可以访问HKCU'Environment。
RunSpace拉。在其他地方提到,打开模拟块是一种避免注册表访问问题的方法。然而,仅仅创建PowerShell对象并不能保证调用Runspace.Open()。