首页 > 解决方案 > 在 VBA 中以管理员身份运行 Powershell 脚本

问题描述

我正在编写一个 VBA 脚本,它将参数发送到 Powershell 脚本以创建 AD 帐户。Powershell 需要在管理员模式下运行。下面是我如何调用脚本来运行。如果有人可以帮助我在管理员模式下运行应用程序,那就太棒了!

strCommand = "Powershell.exe -ExecutionPolicy Unrestricted -file ""<FilePath>""<Parameters>"
Set WshShell = CreateObject("WScript.Shell")
Set WshShellExec = WshShell.Exec(strCommand)

标签: vbapowershell

解决方案


假设script.ps1在当前目录中命名了一个文件,并且参数foobar(或者,在下面删除$PWD并指定完整的脚本文件路径);-NoExit在运行脚本后保持打开的提升的控制台窗口:

strCommand = "powershell.exe -c Start-Process -Verb RunAs powershell.exe \"" -ExecutionPolicy Unrestricted -NoExit -f `\""$PWD\script.ps1`\"" foo bar \"""
Set WshShell = CreateObject("WScript.Shell")
Set WshShellExec = WshShell.Exec(strCommand)

注意需要调用Windows PowerShell CLI , powershell.exe,两次, 嵌套:

  • 首先,为了能够运行 PowerShell 内部Start-Processcmdlet,-Verb RunAs以便创建一个提升的(以管理员身份运行)进程,该进程总是在的控制台窗口中运行。(请注意,WshShell.Exec()它本身是异步运行的,不提供直接反馈。)

    • 请注意,这将显示 UAC 安全对话框以确认创建提升进程的意图,并且此对话框可以设计为只能以交互方式响应。
  • 其次,作为进程被提升以便调用目标脚本被提升。

    • 警告:提升的目标进程将C:\Windows\System32被视为其工作目录,而不是调用者的。要使用调用者的工作目录,您必须从基于-file( -f) 的调用切换到基于-command( ) 的调用-c并首先执行一条Set-Location语句,这尤其可以改变脚本的传递参数的解释方式;看到这个答案

这使引用复杂化,并且要求嵌套调用的"字符在外部调用的命令行中被视为`\"`\""VBScript字符串文字中表示),而外部调用的字符在 VBScript 中被"视为\"\""在 VBScript 中)。

请参阅此答案,了解如何通过参数名称-值对的字典在算法上构造这样的命令行以与许多参数(参数)一起使用。


推荐阅读