Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1766573
  • 博文数量: 234
  • 博客积分: 4966
  • 博客等级: 上校
  • 技术积分: 3322
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-13 01:03
文章分类

全部博文(234)

文章存档

2017年(2)

2016年(1)

2015年(8)

2014年(11)

2013年(44)

2012年(27)

2011年(22)

2010年(30)

2009年(37)

2008年(6)

2007年(45)

2006年(1)

分类:

2011-06-09 14:49:20

问:

您好,脚本专家!如何从本地管理员组中删除管理员和域管理组之外的一切成员?

-- 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。

如前所述,在使用此脚本前,请确保这是您所要的结果。不过,这样如何:您慎用此脚本,作为回报,我们就让您揣着剪刀跑步。成交?

阅读(3416) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~