我有一个批处理脚本,可以在管理模式下调用Powershell文件。我不久前发现了这段代码,从那时起它就很好用了:
PowerShell -NoProfile -ExecutionPolicy Bypass -Command
"& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File %PSFile%' -Verb RunAs}";
这一次,我从另一个程序调用了批处理脚本。该程序说该过程有效,但实际上并没有做任何事情。检查echo中的日志,我可以看到正在调用批处理脚本,但它没有调用Powershell。我尝试手动运行批处理脚本,它调用PS很好,所以其他程序调用批处理脚本的方式正在弄乱它如何调用PS。
考虑到这一点,我尝试更改批处理脚本以直接运行我的.ps1文件,而不是启动PowerShell的新管理实例来启动它。我的新.bat文件看起来像这样:
Powershell -File %PSFILE% -Verb RunAs
从其他程序调用它成功调用我的Powershell脚本,但是我从PS脚本中得到了一堆错误,因为它不是像它需要的管理员PS会话。
如何更改我的批处理脚本以管理员身份调用Powershell,而不使用Powershell调用自身(这似乎不适用于需要运行它的程序)?
编辑:在尝试了一堆调整之后,我发现我甚至不需要处于管理模式来执行此脚本所做的事情。但是,在通过程序运行它时,我仍然会获得访问被拒绝错误(管理员与否)。因此,从程序运行它的一些事情使得它需要比我手动运行批处理脚本时更多的权限。答案 0 :(得分:1)
这就是我所做的(在.bat
文件中):
如果.bat
未以管理员身份运行
powershell.exe -Command "powershell.exe 'C:\path\to\script.ps1' -Verb runAs"
如果.bat
以管理员身份运行
powershell.exe -ExecutionPolicy Bypass -Command "C:\path\to\script.ps1"
答案 1 :(得分:1)
您可以使用我编写的名为elevate32.exe
/ elevate64.exe
的小工具。
elevate64 -- C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -File "d:\path to script\scriptfile.ps1"
elevate32.exe
(32位版本)和elevate64.exe
(64位版本)基本上提升了传递给它们的命令行。
你可以在这里得到它(ElevationToolkit1.zip):
http://www.westmesatech.com/misctools.html
另一种方法是使用一个简短的WSH脚本,在调用时会引发提升。一个例子是Aaron Margosis的博客:
https://blogs.msdn.microsoft.com/aaron_margosis/2007/07/01/scripting-elevation-on-vista/
脚本:
// elevate.js -- runs target command line elevated
if (WScript.Arguments.Length >= 1) {
Application = WScript.Arguments(0);
Arguments = "";
for (Index = 1; Index < WScript.Arguments.Length; Index += 1) {
if (Index > 1) {
Arguments += " ";
}
Arguments += WScript.Arguments(Index);
}
new ActiveXObject("Shell.Application").ShellExecute(Application, Arguments, "", "runas");
}
else {
WScript.Echo("Usage:");
WScript.Echo("elevate Application Arguments");
}
这种方法的局限性在于它依赖于WSH命令行解析器而无法等待程序终止。在您的方案中,这些限制可能不是问题。
答案 2 :(得分:0)
看起来我对问题来源完全不了解。这是我正在编辑的某些文件夹的权限错误。我运行脚本的程序是一个单独的服务。我必须添加修改权限到我正在编辑的所有文件夹的安全组。脚本中不需要提升,只需修改权限。