我有一个奇怪的问题。我们有一些脚本(登录脚本等)需要以提升用户身份运行某些元素。
(为您提供背景知识,我们使用 UAC 来防止在没有用户输入密码的情况下运行任何东西。对于我们想要在没有用户干预的情况下运行的常规、提升的任务,我们编写了一个小型 .Net 应用程序,该应用程序基本上运行命令行输入为提升的用户。)
这已经成功运作了数年。我现在用 Windows 7 64 位测试它,这个过程不再有效。为了测试这个过程,我编写了以下小脚本:
if ( $args[0].Length -eq 0) {
$message = "No input passed"
} else {
$message = $args[0]
}
$a = new-object -comobject wscript.shell
$b = $a.popup($message)
所有这一切都是弹出一个消息框,其中包含传递给它的任何用户输入。
试验结果:
1) 通过创建新进程来调用
([wmiclass]"win32_Process").create('powershell c:\users\me\desktop\testArgs.ps1 "hello"')
结果:这按预期工作 - 弹出框说“你好”
2) 使用 .net Elevation 实用程序调用(带参数)
([wmiclass]"win32_Process").create('C:\swtools\elevator.exe powershell c:\users\me\desktop\testArgs.ps1')
结果:Powershell 窗口以管理员身份打开(如标题栏所示),但在窗口打开时挂起并闪烁光标 - 不显示弹出窗口。(在 Win7 32 位机器上,这按预期工作 - 显示“hello”弹出窗口)
3) 从 Elevation 实用程序调用 powershell(不带参数)
([wmiclass]"win32_Process").create('C:\swtools\elevator.exe powershell')
这可以按预期工作 - 打开一个提升的 powershell 窗口。
最初,这让我认为电梯实用程序及其传递参数的方式出现了问题。但是,我可以调用另一个应用程序,如:
4) 从 Elevation 实用程序调用记事本(带参数)
([wmiclass]"win32_Process").create('C:\swtools\elevator.exe powershell notepad.exe "c:\users\me\desktop\testArgs.ps1"')
这将打开一个记事本实例(由管理员拥有的进程)显示脚本的内容。
基本上每个单独的部分似乎都按预期工作,但三个一起不起作用。(正如我所说,这一切都适用于 Win7 32 位。)