问:
您好,脚本专家!如何从本地管理员组中删除管理员和域管理组之外的一切成员?
-- JS
答:
您好,JS。我们知道,成为医生时都得宣读希波克拉底誓言,该誓言开头著名的一名话是,“首先,不要造成伤害。”成为脚本专家时就得宣读脚本克拉底誓言,该誓言就不那么著名了,开头一名话是,“首先,对他们进行警告。此后如果发生什么不好的事,那就不是自己的错了。”因此,JS,要知道我们已经警告过您了。
实际上,我们即将向您演示的脚本并不特别危险。但是,它可能会带来一点麻烦。按您的请求,该脚本会从本地管理员组中删除管理员和域管理帐户之外的一切帐户。这并没有什么问题,只不过至少在一种情况下除外。例如,在 Microsoft,用户在其计算机上通常都是本地管理员。但是,那些用户从来不以本地管理员身份登录,而是使用其域帐户登录,该域帐户恰好就是本地管理员组的成员。
那么,有什么问题呢?是这样,我们即将向您演示的脚本将会从本地管理员组中删除该域用户帐户;因此,那些用户将不再是本地管理员。这可能正是您希望出现的结果。但预先警告可以做到万无一失。
真实的故事。不久前,一位脚本专家不得不临时从域中删除其计算机。这样做同时也从本地管理员组中删除了其域用户帐户,还有域管理帐户。当然,您仍能以管理员身份登录…,倘若您知道本地管理员密码,那就没问题。您可能已经猜到了,这位脚本专家并不知道本地管理员密码是什么。哎哟…。 哦,不,我们不能告诉您这件事是哪位脚本专家所为:如果有人将其揭发出来,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
是的,它看起来的确没有危害,不是吗?也确实如此:毕竟,域管理员仍然可以访问机器并将某个帐户回添到本地管理员组。这可能会给您带来一点麻烦,但一切都可以得到纠正。
至于脚本本身,它首先连接到指定计算机上的管理员组;在本样例脚本中,该计算机名为 atl-ws-01。建立连接后,脚本通过建立一个 For Each 循环来遍历组中的所有成员;可通过 Members 属性访问所述的成员身份。
在循环内,我们使用以下这行代码确保组成员的名称既非 Administrator 也非 Domain Admins:
If objUser.Name <> "Administrator" AND objUser.Name <> "Domain Admins" Then
请注意,此处使用了 AND 运算符:Name 不是 Administrator 且 Name 不是 Domain Admins。脚本编写者常犯的一个错误是在脚本中使用 OR 运算符,如下所示:Name 不是 Administrator 或 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
现在用 OR 替换 AND,看看会发生什么情况。
明白了吗?实际上,我们时常确实知道自己在谈论什么!
那么,如果某个帐户符合条件,例如,帐户 kenmyer 不等于 Administrator 也不等于 Domain Admins,这时会发生什么。在此情况下,我们只需调用 Remove 方法,将所述帐户的 AdsPath 传递给它;这会从组中删除该帐户:
objGroup.Remove(objUser.AdsPath)
然后,对其他组成员重复该过程。完成后,本地管理员组应该只剩下两个成员:Administrator 和 Domain Admins。
如前所述,在使用此脚本前,请确保这是您所要的结果。不过,这样如何:您慎用此脚本,作为回报,我们就让您揣着剪刀跑步。成交?