您好,JJ。您知道,“脚本专家”并不具备哲学头脑。例如,有一个脚本专家,他一生都信奉这样的信条:永远不要在星期六一大早就接电话。(他的推理相当简单明了:如果是重要电话,他们会再打过来。如果不是重要的电话,那他们为什么要在星期六一大早就打电话呢?!?!)这就是脚本专家的智力所能达到的高度。
不论是好是坏,在回答这个问题的时候,我们必须得用点儿哲学头脑 – 可能还得来点儿形而上学。您现在遇到的问题其实就是您认为空字符串 (“”) 代表空,但是脚本语言却往往认为空字符串代表某种东西。例如,假设您将用户 A 的电话号码设置为一个空字符串。然后,您运行了一个脚本来检索所有拥有电话号码的用户的列表。猜一猜都将有谁列在列表中呢?您猜对了:有用户 A。这是因为,在古怪的脚本编写领域,用户 A 实际上是拥有电话号码的,只不过他的电话号码恰好是由一个空字符串构成的。(是的,这就是孤掌亦鸣的事情。)
若要彻底去除某个属性值,您必须将该属性的值设置为 NULL。在 Active Directory 中,实现此目的的最佳方法就是使用“PutEx”方法并清除该值。让我们向您展示一个真正能将用户的电话号码设置为空 (NULL) 的脚本,然后再说明它是如何工作的:
Const ADS_PROPERTY_CLEAR = 1
Set objUser = GetObject _
("LDAP://cn=ken myer, ou=finance, dc=fabrikam, dc=com")
objUser.PutEx ADS_PROPERTY_CLEAR, "telephoneNumber", 0
objUser.SetInfo
首先,我们定义一个名为 ADS_PROPERTY_CLEAR 的常量并将该值设置为 1;稍后我们将在脚本中使用此常量来指示 PutEx 方法执行我们希望其执行的操作。(PutEx 除了能清除属性值之外,还具有其他一些用途;有关更多信息,请查看“Microsoft Windows 2000 Scripting Guide”(Microsoft Windows 2000 脚本指南)中的 ADSI Scripting Primer(ADSI 脚本编写基础)。)然后,我们绑定到预期的用户帐户,在此例中就是在 fabrikam.com 的财务 OU 中找到的 Ken Myer 帐户。
接下来,我们使用以下两行代码完全删除 Ken Myer 的电话号码:
objUser.PutEx ADS_PROPERTY_CLEAR, "telephoneNumber", 0
objUser.SetInfo
正如您看到的,我们调用了 PutEx 方法并向它传递三个参数:1) 常量“ADS_PROPERTY_CLEAR”,指示我们要执行的操作;2)“telephoneNumber”指示我们要清除的属性;3)“0”是每次您清除属性时所必需的参数。然后,我们调用“SetInfo”方法将更改写回 Active Directory。如果您重新运行该脚本来检索拥有电话号码的用户的列表,Ken Myer 将不会再出现在列表中。这是因为他不再拥有电话号码了,连一个由空字符串构成的电话号码也没有。