嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

還有,別忘了瞧瞧全新經過改良的嗨,Scripting Guy!過往文件

今天的問題:如何將本機 Administrators 群組內容全數移除,只保留 Administrator 和 Domain Admins 群組?


如何將本機 Administrators 群組內容全數移除,只保留 Administrator 和 Domain Admins 群組?

嗨,Scripting Guy!如何將本機 Administrators 群組內容全數移除,只保留 Administrator 和 Domain Admins 群組?

-- JS

JS,您好。您知道嗎?當醫生之前要先對醫學之神 Hippocratic 發誓:「第一條,絕不傷害病人。」而成為 Scripting Guy 之前也要先發誓。雖然沒有那麼有名,我們得對指令碼之神 Scriptocratic 發誓:「第一條,給讀者警告。第二條,如果出錯,錯不在我。」所以 JS,您就當過已經收到警告了。

其實等一下要介紹的指令碼並不危險,但是或許有點惹人討厭。您想知道如何將本機 Administrator 群組內容全數移除,只保留 Administrator 和 Domain Admin 群組。問題倒也還好,但有點麻煩。打個比方,Microsoft 產品的使用者通常也是電腦的本機 Administrator。但是這些使用者從不以 Administrator 的身份登入,而是使用自己的網域帳戶登入,而這個帳戶也恰好是本機 Administrators 群組的成員。

那麼還有什麼問題呢?這麼說好了,待會介紹的指令碼會把網域使用者帳戶從本機 Administrators 群組移除,使用者就不再是本機系統管理員了。這大概是您希望的結果,但我們已經給您警告,讓您有機會作準備囉。

 

真人真事:不久前其中一名 Scripting Guy 需要將電腦自網域中暫時移除。於是就這麼做了,連帶把網域使用者帳戶和 Domain Admins 帳戶一併從本機 Administrators 群組移除。當然您還是 Administrator... 只要您知道本機 Administrators 的密碼就沒有問題了。讀者應該已經猜到了,這位 Scripting Guy 根本不知道本機 Administrators 密碼是什麼。糟糕...

不好意思,我們不能透露是哪一位天才幹的好事,不然 Jean 會羞愧地撞牆。


這就像不要帶著剪刀跑,不要把手指頭插進燈泡插座一樣的道理。如果這個指令碼會把自己鎖在機器外頭,千萬別用。

strComputer = "atl-ws-01"
Set objGroup = GetObject("WinNT://" & strComputer & "/Administrators")
For Each objUser In objGroup.Members
    If objUser.Name <> "Administrator" AND objUser.Name <> "Domain Admins" Then
        objGroup.Remove(objUser.AdsPath)
    End If
Next

是啊,這個指令碼看起來好無辜啊。這樣說也有道理,因為網域 Administrator 還是可以存取機器,然後把使用者加到本機 Administrators 群組內。這樣雖然有點麻煩,但不是不可挽回。

現在來討論指令碼的內容,首先是將 Administrators 群組連接到指定的電腦,本例中是一台叫做 atl-ws-01 的機器。連線完畢後指令碼會以 For Each 迴圈逐一處理群組的所有成員,成員身份可透過 Members 屬性存取。

在迴圈內使用這行指令碼,確保群組成員的名稱既不是 Administrator 也不是 Domain Admins:

If objUser.Name <> "Administrator" AND objUser.Name <> "Domain Admins" Then

注意這裡對 AND 運算子的用法:Name 不等於 Administrator AND Name 不等於 Domain Admins。指令碼撰寫人員最常犯的錯誤就是對 OR 的用途:Name 不等於 Administrator OR Name 不等於 Domain Admins。注意不要落入陷阱。

為什麼不能這麼做?其實很簡單:否則群組內的成員都會符合這個條件。就拿 Administrator 帳戶當例子吧。有人誤以為只要帳戶名稱等於 Administrator,似乎就不符合條件了。但是萬一名稱不等於 Domain Admins,就會符合條件了。因為如果名字不等於 Administrator 或是不等於 Domain Admins,就符合條件了。因此一定要確保名稱不等於 Administrator,而且也不等於 Domain Admins。

如果您還是不懂,試試看執行指令碼,它會傳回群組成員的名稱:

strComputer = "atl-ws-01"
Set objGroup = GetObject("WinNT://" & strComputer & "/Administrators")
For Each objUser In objGroup.Members
    If objUser.Name <> "Administrator" AND objUser.Name <> "Domain Admins" Then
        Wscript.Echo objUser.Name
    End If
Next

現在把 AND 替換為 OR,看看結果如何。

看吧?有時候我們至少知道自己在說什麼,可不是胡言亂語。

如果有任何帳戶符合條件,例如帳戶 kenmyer 不等於 Administrator,而且也不等於 Domain Admins。這時只要呼叫 Remove 方法,將找到的帳戶的 AdsPath 傳給這個方法,就可以將帳戶從群組中移除:

objGroup.Remove(objUser.AdsPath)

接著對其他群組成員重複此程序。完成後本機 Administrators 群組應該只剩下兩個成員:Administrator 和 Domain Admins。

剛才警告過您,請先搞清楚是否真的要這麼做,再使用指令碼。還不滿意嗎?這樣好吧:您小心使用指令碼,我們就讓您帶剪刀跑。就這麼說定?


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首