嗨,Scripting Guy!

嗨,Scripting Guy!

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

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

今天的問題:如何變更 Microsoft Office 中的使用者資訊?


如何變更 Microsoft Office 中的使用者資訊?

嗨,Scripting Guy! 我要如何變更 Microsoft Office 中的使用者資訊,讓它與儲存在 Active Directory 的使用者名稱相同呢?

-- SM

SM,您好。我們有一位 Scripting Guy 曾在一所本地大學工作,其中一個科系 (有 300 多位使用者) 的每一份文件,看起來都是由同一個人所建立;那是因為 Office 是由一位服務台技術人員安裝在每一部機器上,可能是缺乏指導吧,竟然打上他自己的名字作為預設的使用者名稱。這個技術人員既然是每一份 Office 複本的使用者,當然每一份 Office 文件的作者都是他了。即使離開這所大學之後,真應了「凡走過必留下痕跡」,因為沒人知道有什麼方法,可以既快又方便的更改這項資訊 (JC,您走了,可是您的精神永遠與世人長相左右)。

唉,如果當時有 Scripting Guy 就好了!其實,要更改 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 之後,我們就用下面這兩行程式碼來變更 UserNameUserInitials 屬性的值:

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 相關資訊,包括使用者的「辨別名稱」。「辨別名稱」是一種 Active Directory 屬性,可提供一條直接通往使用者帳戶的路徑,如下所示:

CN=kenmyer, OU=Finance, DC=fabrikam, DC=com

如果我們知道使用者帳戶的「辨別名稱」,就可以連結到該帳戶,擷取各種好玩的資訊,包括 givenName (名字) 和 SN (別名或姓氏) 屬性的值。

那麼,要如何連接到使用者帳戶呢?很簡單,只要使用下面這兩行程式碼就行了:

strUser = objSysInfo.UserName
Set objUser = GetObject("LDAP://" & strUser)

在第一行中,我們把 UserName 屬性的值,儲存在一個名叫 strUser 的變數中;而 UserName 屬性 (衍生自 ADSystemInfo 物件) 就是使用者的「辨別名稱」。而第二行就把該值結合 LDAP:// 提供者,建立一個如下所示的 ADsPath:

LDAP://CN=kenmyer, OU=Finance, DC=fabrikam, DC=com

我們可以在 GetObject 方法代入 ADsPath,連接到登入使用者的 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,我只能說:世事無「長」。


如需詳細資訊

請參閱嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首