【发布时间】:2015-07-01 01:00:11
【问题描述】:
我正在使用以下 PSExec 命令在 VMware Player 7 虚拟机上运行 WScript 文件:
psexec \\devtest1 -u "Administrator" -p "password" -h -i 1 -d c:\windows\system32\wscript.exe c:\scripts\closefiles.vbs
此 PSExec 命令在虚拟机 DEVTEST1 上运行 closefiles.vbs 文件。运行时,closefiles.vbs 文件应该检测任何打开的 Excel 2007 实例,如果找到,则保存每个打开的工作簿,然后关闭每个工作簿。在虚拟机本地运行时,closefiles.vbs 完美执行。
当我使用远程机器上的 PSExec 在虚拟机上执行 closefiles.vbs 文件时,就会出现问题。 Windows 7 已锁定 UAC 远程访问以防止环回攻击。出于安全原因,我必须保留此限制(我知道如何更改注册表以删除 UAC 远程访问限制)。这意味着我可以用来在虚拟机上运行任何应用程序而不使用远程桌面客户端(我不能在此应用程序中使用)的唯一帐户是虚拟机的管理员帐户。
当我使用 PSExec 在虚拟机上运行 closefiles.vbs 并从远程机器上运行虚拟机的管理员帐户和密码时,遇到以下语句时会出现 429 错误:
Set objXL = GetObject( , "Excel.Application")
当管理员以外的任何用户登录虚拟机时,对虚拟机运行 PSExec 命令时,总是会发生这种情况。但是当管理员在虚拟机上登录时,closefiles.vbs 文件会完美执行。为什么 closefiles.vbs 在虚拟机管理员登录时起作用,而在任何其他虚拟机用户登录时不起作用?我该如何解决这个问题?这是 closefiles.vbs 代码:
Option Explicit
'--------------------------------------------------
'*** Dimension Local Variables ***
Dim objXL, i
'*** Enable Error Handling ***
On Error Resume Next
'*** Set Excel Object Variable ***
Set objXL = GetObject( , "Excel.Application")
'*** Trap Error And Shutdown Computer If No Open Excel Workbooks ***
If Err.Number > 0 Then 'No open Excel workbooks
MsgBox ("ErrorLevel ... " & Err.Number)
Wscript.quit
End If
'*** Save Data And Close Each Open Excel Workbook ***
For Each i In objXL.Workbooks 'Close each open Excel workbook
i.Save
i.Close
Next
提前感谢您提供的任何帮助。
【问题讨论】:
-
仔细检查交互式用户登录的会话号,即 psexec 命令行中的
-i 1。任务管理器可以通过选择列选项向您显示会话编号。但如果 COM 只能找到与进行调用的同一用户关联的现有 Excel.Application 对象,我不会感到惊讶。 -
我没有在我的原始帖子中包含这个,但是我使用 qwinsta 来查询虚拟机并将其活动用户会话号作为变量 %id% 返回给 PSExec 命令(两者都是 qwinsta和 PSExec 存在于从远程计算机对虚拟机运行的同一个 .cmd 文件中)。我想让我的原始帖子尽可能简单。我知道会话号以交互方式工作,因为我可以在虚拟机上成功显示 WScript shell.popup 消息。是否有某种方式 COM 不会“看到”交互式工作的会话编号?
-
如果脚本可以向用户显示一条消息,那么它在正确的会话中运行,所以这不是您的问题。 COM 或 Office COM 对象似乎更有可能在不同的用户帐户之间实施分离。但是,它可能仍然与 psexec 有关。要消除这种可能性,请尝试以其他用户身份登录 VM,然后使用“运行身份”在管理员帐户的上下文中运行脚本。我怀疑你会发现这也行不通。
-
可能的解决方法:编写一个脚本或程序,在用户上下文中运行,在后台(例如,通过启动文件夹启动)并在触发时代表您执行工作。
-
我不熟悉在远程机器上使用 runas。所以我在虚拟机的任务计划程序中创建了一个任务。我在创建任务时使用了管理员组,因此我没有将其视为可能的权限问题。然后我使用 schtasks 从虚拟机上的管理命令提示符运行任务。当我以管理员身份登录虚拟机时,我没有收到 429 错误。但是当我以管理员组成员的任何其他用户身份登录时,我收到了 429 错误。这感觉像是权限问题。建议?
标签: windows excel vbscript com psexec