在 HKCU 下修改系統資料庫的 Windows 註銷腳本
我正在嘗試在註銷時修改 HKCU 中的系統資料庫項。手動呼叫時,相應的腳本可以正常工作。我擔心環回策略可能會出現問題,但根據 rsop.msc 的說法,情況並非如此,即應該執行腳本。但是,在下次登錄時,系統資料庫中的預期效果並不存在。
是否僅僅因為腳本執行“太晚”而存在一般問題?如果可以,可以做什麼?這還能是什麼?
編輯: 我應該指定我的
logoff.vbs
腳本的樣子(最小化):const HKCU = &H80000001 Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") ' ... oReg.SetStringValue HKCU,"SOFTWARE\Foo","Bar", "Baz"
我經常使用註銷腳本。當腳本執行並且可以對其系統資料庫進行修改時,仍會載入使用者的系統資料庫。根據設計,註銷腳本同步執行。我有從使用者系統資料庫讀取的註銷腳本,但我從來沒有機會寫。即便如此,我希望它會正常工作。
我將上面的程式碼片段放在一個文件中,並將其分配為 Windows XP SP3 VM 上本地組策略中的註銷腳本,並獲得所需的結果。我設置
HKCU\Software\Foo\Bar
了等於xxx
,註銷,再次登錄,發現值已經變成了Baz
,和預期的一樣。除了腳本執行之外,我認為您還有其他類型的問題。我添加了
MsgBox
對程式碼的呼叫,因此我可以“看到”註銷時執行的程式碼。添加 MsdBox 並沒有改變與系統資料庫相關的行為,但確實給了我程式碼正在執行的視覺指示(並且在我關閉對話框之前一直保持註銷)。(如果您願意,我也可以繼續在 Windows 7 上進行測試,但我預計功能不會發生變化。)
我想你正在使用
reg.exe
修改系統資料庫項。問題是它reg.exe
在一個單獨的程序中執行,並且註銷腳本只等待自己完成。因此,系統資料庫配置單元很可能在編輯完成之前被解除安裝。我認為您可以使用兩行 WScript 來解決該問題,例如以下範例:
Set objShell = CreateObject("WScript.Shell") objShell.Run "REG ADD HKCU\key ...",,true
的第三個參數
objShell.Run
稱為bWaitOnReturn
,告訴腳本在繼續執行之前等待外部程序完成。