您好,SM。以前,有一位脚本专家在一所地方大学工作。在某个拥有 300 多名用户的院系中,每篇文档都似乎由同一人创建;这是因为每台计算机上的 Office 都由同一名技术支持人员安装,由于没有其他指示,因此他输入了自己的姓名作为默认用户名。由于此技术人员是每个 Office 副本的假定用户,因此每篇 Office 文档都将他显示为作者。即使在他离开该大学之后,他遗留的问题仍然存在;因为无人知晓更改该信息的快捷方法。JC,你可能已经离开,但你永远不会被遗忘。
如果那时他们有脚本专家就好了!实际上,在 Office 中更改用户信息并使之与要引导的 Active Directory 中发现的用户名匹配相当容易。让我们先向您展示一个更改用户信息的普通硬编码脚本,然后我们将讨论如何使该脚本变得更为动态。
需要注意的是,我们将使用 Microsoft Word 来更改用户信息。我们也可使用 Microsoft Excel 或 Microsoft PowerPoint;使用任何此类应用程序都可为 Microsoft Office 全局更改用户信息。但是,Excel 和 PowerPoint 只允许更改用户名;不允许更改用户名的缩写。这可能是个问题:在 Microsoft Word 中(我们认为这是唯一可显示用户名缩写的地方)您最后可能成为用户名是 Ken Myer 而缩写却是 JC 的用户。使用 Word,我们既能更改姓名又能更改缩写。所以我们决定使用 Word。
而且,此脚本确实需要在用户的计算机上安装 Word。但如果您未安装 Word,可能也未安装 Office,这就毫无意义了。
我们的脚本如下:
Set objWord = CreateObject("Word.Application")
objWord.UserName = "Ken Myer"
objWord.UserInitials = "KM"
objWord.Quit
没错:只有 4 行代码。我们先创建了 Word.Application 对象的一个实例。您可能注意到与我们大多数的 Microsoft Office 脚本不同,在此脚本中我们未将 Visible 属性设置为 True。这是因为我们不想在屏幕上查看 Word;我们只想启动它,更改用户信息,再将其关闭。任何人都没有必要查看此过程。
启动 Word 后,我们使用下面两行代码更改 UserName 的值以及 UserInitials 属性:
objWord.UserName = "Ken Myer"
objWord.UserInitials = "KM"
就是这样:我们调用 Quit 方法终止 Word 实例,之后即告完成。下次启动 Word 或任何 Office 应用程序时,用户名将显示为 Ken Myer 而用户名缩写为 KM。
只要事先知道登录到计算机的用户名,此脚本非常好用。但如果事先不知道用户名,或者计算机有多个用户时又将如何呢?如何动态确定用户名然后更改 Office 用户信息?
当然,为什么您只是使用以下脚本:
Set objSysInfo = CreateObject("ADSystemInfo")
strUser = objSysInfo.UserName
Set objUser = GetObject("LDAP://" & strUser)
Set objWord = CreateObject("Word.Application")
objWord.UserName = objUser.givenName & " " & objUser.SN
objWord.UserInitials = Left(objUser.givenName, 1) & Left(objUser.SN, 1)
objWord.Quit
不必担心,我们将对此进行解释。在解释前,应注意的是我们假定此脚本作为登录脚本运行;这样此脚本将在用户每次登录计算机时运行并相应地修改 Office 用户信息。此脚本无法在远程运行(至少是很难),这是因为 ADSystemInfo 对象只能在本地创建。
当然,这产生了一个很明显的问题:什么是 ADSystemInfo 对象,我们为什么需要它?ADSystemInfo 对象可用于获取有关登录用户的一些有用的 Active Directory 相关信息,包括上述用户的 Distinguished Name。Distinguished Name 是一种 Active Directory 属性,可提供用户帐户的直接路径,此路径类似如下:
CN=kenmyer, OU=Finance, DC=fabrikam, DC=com
如果我们知道用户帐户的 Distinguished Name,我们可绑定到该帐户并可检索所有有用的信息,包括 givenName(名)和 SN(姓)属性的值。
那么,如何绑定到用户帐户呢?我们只需使用下面两行代码:
strUser = objSysInfo.UserName
Set objUser = GetObject("LDAP://" & strUser)
在第一行中,我们在名为 strUser 的变量中存储 UserName 属性的值;UserName 属性(取自 ADSystemInfo 对象)则是用户的 Distinguished Name。在第二行中,我们将该值与 LDAP:// 提供程序结合,产生类似下面的 ADsPath:
LDAP://CN=kenmyer, OU=Finance, DC=fabrikam, DC=com
通过将 ADsPath 传递到 GetObject 方法,即可连接到登录用户的 Active Directory 用户帐户。之后,我们就自由得多了。
实际上,脚本的其余部分就是我们在今天专栏的开始部分向您展示的硬编码脚本的变体。我们创建了 Word.Application 对象的一个实例,然后使用此代码行配置用户名:
objWord.UserName = objUser.givenName & " " & objUser.SN
正如您所看到的,我们将 givenName、空格及 SN 连接起来,从而形成了类似 Ken Myer 的姓名。这相当容易。
设置用户名缩写则稍有棘手;这是因为 Active Directory 没有存储用户名缩写的属性。因此我们必须从用户的姓和名中提取首字母缩写。为执行此操作,我们使用了 Left 函数及此代码行:
objWord.UserInitials = Left(objUser.givenName, 1) & Left(objUser.SN, 1)
为获取用户名的首字母,我们使用以下代码:
Left(objUser.givenName, 1)
我们只是向 Left 函数传递了两个参数:objUser.givenName,该参数含有用户的名和值 1。1 将指示函数在字符串的左侧开始提取 1 个字符;如果用户的名是 Ken,此函数将返回字母 K。我们再重复此过程以获取姓的首字母,然后将两个字母合并到一起形成用户名缩写。
将前面的脚本作为登录脚本运行,每次用户登录时都会相应设置 Microsoft Office 的用户信息;而这意味着您的 Office 文档将显示真正的作者,而非软件的安装者。对不起,JC,但你知道他们在说什么:没什么能够永恒不变。