Windows 由于断电而关机前自动保存并关闭打开的Excel 2007文件

Windows 由于断电而关机前自动保存并关闭打开的Excel 2007文件,windows,excel,vbscript,uac,psexec,Windows,Excel,Vbscript,Uac,Psexec,在发出shutdown.exe或psshutdown.exe之前,我花了好几天时间试图找到一种方法来保存用户打开的Excel 2007文件。我使用的是Windows 7 Pro 64位机器,启用了UAC,包括远程限制。我不想绕过这些安全措施 我已经开发了vbscript,可以做这项工作,但它只在本地运行。代码如下所示: Option Explicit '-------------------------------------------------- '*** Dimension Local

在发出shutdown.exe或psshutdown.exe之前,我花了好几天时间试图找到一种方法来保存用户打开的Excel 2007文件。我使用的是Windows 7 Pro 64位机器,启用了UAC,包括远程限制。我不想绕过这些安全措施

我已经开发了vbscript,可以做这项工作,但它只在本地运行。代码如下所示:

Option Explicit
'--------------------------------------------------

'*** Dimension Local Variables ***
Dim objXL, msg, i, WshShell, strShutdownMessage, strMsg

'*** Enable Error Handling ***
On Error Resume Next

'*** Display Server Emergency and Computer Shutdown Message ***
Set WshShell = WScript.CreateObject("WScript.Shell") 'Creates an instance of the Windows Scripting Host shell (WshShell)
'--- Popup Message - Automatically Closes After 15 Seconds ---
'--- (the "4112" nType value is the sum of 16 - Critical window type + 4096 - display on top!!)
WshShell.Popup "AN UNEXPECTED SERVER EMERGENCY HAS OCCURRED." & Chr(13) & Chr(13) &_
"THIS COMPUTER WILL AUTOMATICALLY SHUT DOWN 30 SECONDS FROM WHEN THIS MESSAGE DISAPPEARS.  " &_
"PLEASE SAVE YOUR DATA AND CLOSE ALL OPEN APPLICATIONS IMMEDIATELY!", 15, "SERVER EMERGENCY SHUTDOWN WARNING!",4112

'*** Debugging Exit ***
'WScript.quit

'*** Wait 30 Seconds Before Saving Data, Closing Applications, and Shutting Down Computer ***
WScript.Sleep 30000

'*** 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
 WshShell.run("c:\windows\system32\shutdown.exe /f /s") 'Run shutdown command
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

'*** Shutdown Computer ***
WshShell.run("c:\windows\system32\shutdown.exe /f /s")
我遇到的问题是,当代码执行以下语句时抛出429错误:

Set objXL = GetObject( , "Excel.Application")
我尝试过psexec、runas、vmrum远程机器是一个VM,甚至任务调度器来解决这个问题。我甚至想出了如何确定远程VM上登录用户的会话号,以便将其传递给psexec,使其能够与远程VM用户交互运行。关机警告消息正确显示在远程VM活动用户的桌面上。但我总是遇到429错误-除非我使用远程VM的本地管理员帐户登录本地和远程计算机,这是一个工作组,而不是域,顺便说一句。我最初认为这可能是psexec问题,但我现在认为这可能是Office 2007或Windows 7 UAC权限问题,这要感谢Harry Johnston在回答我原来的帖子时说:

使用PSExec在虚拟机上运行WScript文件时发生GetObject 429错误 机器


在发出关机命令之前,是否有办法将打开的Excel文件保存到远程计算机上?我不相信办公室的自动储蓄。我的客户的数据太重要了,不能在断电或无法正确使用AutoSave时丢失。

如果您正常关机,Word等将弹出对话框。正常关机只是请求程序关闭,任何程序都可以取消它。当强制程序终止时

因此,请在客户端中正常关闭excel。他们将得到一个对话。他们也可以取消。taskkill命令行程序可以做到这一点

taskkill /s computername /im excel.exe

如果他们拒绝关闭,您可以使用/f标志强制关闭。

这个问题的简单答案是,我在远程计算机上运行的vbscript没有在远程计算机登录用户的安全上下文中运行。因此,Office 2007不允许从Excel.Application ActiveX组件创建objXL对象,因此出现429错误消息,ActiveX组件无法在以下代码行中创建对象:

Set objXL = GetObject( , "Excel.Application")
因此,挑战在于如何在远程计算机登录用户的安全上下文中运行我的vbscript或任何应用程序。我最终决定使用PSEXEC作为在远程机器上运行vbscript的实用工具。PSEXEC有三个问题我必须处理,以使我的vbscript在没有429错误的情况下成功执行。如果使用PSEXEC以外的其他工具,则问题列表可能会有所不同。这些问题仅存在于远程计算机上:

远程过程调用RPC引擎未激活 已启用UAC远程访问限制 应用程序必须在登录用户的Windows 7会话中运行 解决第一个问题需要在远程计算机上启用RPC引擎。为此,您必须配置并启动四个4 Windows服务,并配置一个注册表项以启用远程RPC。配置注册表项以启用远程RPC,如下所示:

Option Explicit
'--------------------------------------------------

'*** Dimension Local Variables ***
Dim objXL, msg, i, WshShell, strShutdownMessage, strMsg

'*** Enable Error Handling ***
On Error Resume Next

'*** Display Server Emergency and Computer Shutdown Message ***
Set WshShell = WScript.CreateObject("WScript.Shell") 'Creates an instance of the Windows Scripting Host shell (WshShell)
'--- Popup Message - Automatically Closes After 15 Seconds ---
'--- (the "4112" nType value is the sum of 16 - Critical window type + 4096 - display on top!!)
WshShell.Popup "AN UNEXPECTED SERVER EMERGENCY HAS OCCURRED." & Chr(13) & Chr(13) &_
"THIS COMPUTER WILL AUTOMATICALLY SHUT DOWN 30 SECONDS FROM WHEN THIS MESSAGE DISAPPEARS.  " &_
"PLEASE SAVE YOUR DATA AND CLOSE ALL OPEN APPLICATIONS IMMEDIATELY!", 15, "SERVER EMERGENCY SHUTDOWN WARNING!",4112

'*** Debugging Exit ***
'WScript.quit

'*** Wait 30 Seconds Before Saving Data, Closing Applications, and Shutting Down Computer ***
WScript.Sleep 30000

'*** 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
 WshShell.run("c:\windows\system32\shutdown.exe /f /s") 'Run shutdown command
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

'*** Shutdown Computer ***
WshShell.run("c:\windows\system32\shutdown.exe /f /s")
HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer

AllowRemoteRPC。。。德沃德=1 fDenyTSConnections。。。德沃德=0 四个Windows服务的配置应如下所示:

远程桌面配置服务。。。手动启动。。。必须启动 远程桌面服务。。。手动启动。。。必须启动 远程桌面服务用户模式端口重定向器服务。。。手动启动。。必须启动 远程过程调用服务。。。自动启动。。。必须启动 第二个问题是UAC远程访问限制,它阻止任何在Windows 7计算机上拥有帐户的用户使用远程PRC远程访问计算机。远程PRC是PSEXEC用于在远程计算机上运行应用程序的机制,除非使用计算机的内置管理员帐户。Windows 7内置管理员帐户不受UAC远程限制的影响这解释了为什么在使用管理员帐户时执行vbscript时没有出现429错误。但是,其他每个用户帐户都会受到影响

经过几天的测试,我了解到只有在远程机器的登录用户的安全上下文中运行应用程序,才能在远程机器上成功执行。这意味着PSEXEC必须使用远程计算机当前登录用户的登录凭据,以便应用程序访问远程计算机登录用户的安全上下文,而不会抛出429错误。这是帮助我配置此解决方案以解决问题的关键学习内容 e 429错误问题

但是,假设我有办法获得远程计算机的登录用户的登录凭据,我如何使用远程计算机的登录用户的登录凭据;如果远程计算机的UAC远程访问限制首先拒绝我访问远程计算机,那么稍后将详细介绍如何在登录用户的安全上下文中执行我的vbscript?我能让它工作的唯一方法是关闭远程机器的UAC远程访问限制。这不是一个微不足道的决定,因为关闭UAC远程访问限制会打开远程机器进行环回攻击。但是,如果我要让PSEXEC在远程机器的登录用户的安全上下文中的远程机器上运行我的vbscript,我没有其他选择。要关闭UAC远程访问限制,请在远程计算机上修改以下注册表项:

HKEY\U本地\U机器\SOFTWARE\Microsoft\Windows\CurrentVersion\Policys\System

值为0表示UAC远程限制;值为1将禁用UAC远程限制。将此值更改为1以禁用UAC远程访问限制。这将允许PSEXEC访问远程计算机,以使用远程计算机登录用户的登录凭据来运行其应用程序负载

最后一个也是最具挑战性的问题是,如何确定哪个用户在远程计算机上登录,然后使用他们的用户名和密码在登录用户的安全上下文中运行PSEXEC。这个问题的解决方案是使用QWINSTA查询远程机器上的会话数据。这涉及到创建一个Windows 7 command.cmd文件,该文件使用QWINSTA查询远程计算机,并确定哪个用户名与远程计算机的活动会话以及活动会话的ID相关联


使用Windows 7.cmd文件中的一系列DOS compare==语句,将QWINSTA用户名值与远程计算机用户及其密码列表进行比较,以确定远程计算机的登录用户密码。用户名、密码和会话ID随后作为扩展的DOS变量传递给PSEXEC语句。PSEXEC应用程序负载可以在远程机器上以正确的用户会话运行。这也是一个很难解决的问题,需要登录用户的凭据。它是正确的用户会话和登录用户登录凭据的组合,将PSEXEC应用程序连接到登录用户的安全上下文,并允许它在不生成429错误的情况下运行。

是的,我知道这一点。我试图解决的用例是当用户没有保存他们的工作,并且在会议、午餐等时间停电时,他们不在计算机旁。。虽然从技术上讲这是用户的问题,但为了保留新的客户端,我想防止这种情况发生。如果保存它,请确保不会覆盖原始文件-人们编辑文件以丢弃更改。是的,我知道这一点。这个问题没有完美的解决办法。我计划使用期望管理来处理这个问题,这意味着如果用户在离开机器之前不保存他们的测试更改,那就是他们的责任。