Group-Policy

在 HKCU 下修改系統資料庫的 Windows 註銷腳本

  • March 1, 2013

我正在嘗試在註銷時修改 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,告訴腳本在繼續執行之前等待外部程序完成。

引用自:https://serverfault.com/questions/482556