提問:“看了這麼多高手的文章,卻沒有找到一個非常簡單的問題的答案:
即如何為一個域使用者佈建登陸指令碼?
- BAT可否作為登陸指令碼?
- 在域使用者“屬性”中,應如何指定登陸指令碼名?"D:\x.bat"還是"\\srv\x.bat"?還是其它?
- 指令碼應該放在何處?
- 還有沒有其它要注意的問題?”
(參加原帖熱烈的討論 http://www.winmag.com.cn/forum/itemdisplay.asp?boardid=24&id=393362) 回答:1、bat可以作為登陸指令碼執行,確切說一切可以在windows平台執行的東西都可以作為登陸指令碼來用。
2、應該指定以\\server\……這樣格式開頭的路徑。因為client在登陸的時候執行指令碼,其實是從伺服器上下載到本地,然後執行。這樣的話,如果指定c:\這樣的路徑,client只會在本地的c盤尋找,而不是到server上的路徑去尋找。
3、指令碼可以放在一切client能夠讀取的位置。通常這個位置處於\\server\netlogon的share下(在伺服器上的位置是%systemroot%\sysvol\sysvol\domainname\scripts),但是如果你制訂了策略,那麼指令碼預設的存放路徑應該在%systemroot%\sysvol\sysvol\domainname\policies\guid\user(machine)\scripts下,如果你放在別的位置,需要在指令碼執行欄的位置輸入絕對路徑,格式同樣需要以\\server\……開頭。
4、其他的問題也很多了,一般來說就是指令碼適用於策略的時候,用戶端可能會執行不到。
一般來說可能會有一下的幾個原因:
a、指令碼從名稱到內容都儘可能的不要用特殊字元、長檔名(超過8個字元)、空格,比如&等。這樣的指令碼在不同的os上可能執行會有問題。b、指令碼存放的位置和路徑,請遵照上面的原則來做。c、指令碼的編寫方面。特別是適用net use 來map一個fileserver上的路徑。有可能在登陸之前,client上已經有網路盤的映射,如果恰好和你map的盤符一樣,將有可能導致指令碼執行失敗,你可以在指令碼的最前面加一句net use * /d /y來解決這個問題。
不過這個命令要慎用,在實際生產環境中,如果你的fileserver是非wintel平台的storage,回應時間較長,那麼可能導致使用者重新登陸時,無法串連fileserver上的sharefolder,可以用一句if exist來判斷網路盤是否存在。
另外一個方面,如果遠程裝置是一些跨平台的存放裝置,比如一些nas、san等,map到windows平台的時候可能會提示“網路路徑無法串連”等問題,可以相互更換map \\server_netbios_name或者map \\server_ipaddress兩種方式來嘗試串連。
如果遇到許可權問題,那麼按照共用許可權和安全許可權衝突時取最小值的原則,一般來講可以將共用使用權限設定為full control,然後安全許可權做嚴格設定的辦法來解決。 d、“設定檔路經”和“登陸指令碼路徑”、“主資料夾”朋友們在初次設定域賬戶指令碼的時候,可能對於這三個概念有些模糊,難以區分,這裡說明一下:①使用組策略,在使用者登入指令檔的的地方編輯一個cmd等,使用諸如net use的方式就可以map一個網路盤符了。
②“配製檔案路徑”是指使用者profile所處的位置,通常在%userprofile%
“登入指令碼路徑”是指使用者登入到伺服器時,執行的指令碼所處的位置,通常預設路徑位於
伺服器上的netlogon下,如果制定策略中使用指令碼,預設的路徑應該在gpo 的guid下的user或者computer下的scripts,如果置於其他位置,需要手動指定完全路徑。
③“主資料夾”是指使用者在fileserver上的個人主目錄,這個概念沒有絕對的位置。需要你手動指定路徑,不過在這裡寫入和在指令碼中寫入的不同,在於系統會根據你寫入的路徑,自動建立檔案夾,並為該使用者指派許可權,該檔案夾的owner屬於該使用者。這裡可以使用%username%的變數,讓系統自行完成。當然在指定了 主目錄後,你仍然可以訪問其他有許可權使用的資源。e、關於策略的執行順序是本機、網站、域、ou、子ou。如果有設定上的重複,按照執行的順序,後面的設定將會覆蓋前面的設定。
如果在ou上設定“block policy inheritance”,那麼上層的策略將不會在這一層獲得執行。
如果在ou上設定“No override”,那麼這一層將不會被後面的原則設定覆蓋,也就是說即使後面有相同的設定,仍然以這一層的設定為準。
如果在ou上設定“disabled”,那麼這個策略將會被禁止執行。
如果在策略的properties security上取消了對應的組的read和apply group policy,那麼對應的組將會無法應用到策略。通常預設被應用的組有authenticated user。
如果你取消了該組的兩個許可權,然後add其他組,同樣賦予read和apply group policy的話,此策略將只會被該組執行到,這也就是所謂的filter。
如果你的域中有多台dc,可能需要在dssite.msc中手動同步它們。
你也可以在伺服器上使用secedit /refreshpolicy user_policy(machine_policy) /enforce 來強制重新整理策略
這樣的辦法同樣適用於client。
f、執行的指令碼,可以放在computer configuration和user configuration中執行。
對於user,通常可以放置更改使用者屬性的東西。
對於computer,通常可以放置更改電腦屬性的東西。
這兩個沒有絕對界限,但通常登陸的時候,都屬於domain users成員,這樣如果需要更改註冊表或系統檔案之類的,可能會遇到許可權問題,那麼我們也可以把這樣的指令碼放在computer中,這樣可以在user登陸之前獲得執行。
(這裡順帶說一句:大家很少用到電腦賬戶吧,那麼電腦賬戶的作用在這裡可以得到體現,由於此時還沒有使用者賬戶驗證,電腦賬戶和dc的驗證有一方面來源於本機電腦賬戶和dc之間保持一個密碼同步化,以便於在這種特殊的情況下獲得驗證,該密碼預設30天變更一次。
你甚至可以在sharefolder上添加電腦賬戶的許可權:)如果由於dns對應或者其他的一些原因,導致這個密碼無法同步,dc將會無法驗證該電腦賬戶,這可能會導致電腦登陸指令碼無法執行。在dc的日誌上一般都會給出一個錯誤提示,ComputerNetbiosName$無法存取。解決的辦法,可以通過在用戶端上執行netdom重設該信任關係,這是另話了。)
對於user的設定,只需要登出然後登入即可獲得指令碼的應用。
對於computer的設定,則需要重新啟動機器來獲得指令碼的執行。
註:從上面的幾點中,大家可以看到電腦在登陸的時候需要通過dns來定位dc,從而定位
定位gpo,sysvol(策略、指令碼、系統管理範本都存放在這裡),dns對於ad的設定是至關重要
的,一般來說可以這樣設定,將用戶端的dns指向dc(如果dc上是雙網卡的話,那麼指向內部
網卡dns),然後在dc上設定轉寄,forward到外部(isp)dns。
上面只是就一些常見的問題做簡要介紹,如果遇到更為複雜的問題,就需要查閱其他資料來解決了。
關於大家平時遇到的問題,都整理成faq放在下面 FAQ: ★看了你給的配置過程連結:http://www.winmag.com.cn/forum/itemdisplay.asp?boardid=24&id=393362但運行還是出錯?
我的配置過程如下:
1、製作指令檔config.bat並拷貝至網域控制站伺服器下的sysvol\sysvol\scripts目錄下
該指令檔用 net use z: \\linux_file\share 命令
2、配置“配製檔案路徑”:路徑指向:\\nwf_sav(域控制伺服器名)\netlogon
配置“登入指令碼路徑”: config.bat
3、在客戶機登出重新登陸時出現以下視窗:但未能將共用資料夾映射為Z盤。 (參與原帖熱烈的討論 http://www.winmag.com.cn/forum/itemdisplay.asp?boardid=24&id=509835) 回答:一般指令碼的存放位置有兩種觀點:
1、將登陸指令碼放在\\server\netlogon下(在dc上的實體路徑是 %systemroot%\SYSVOL\sysvol\domainname\SCRIPTS ,而不是 sysvol\sysvol\scripts)
在設定賬戶屬性中登陸指令檔的時候,此時是登陸域的時候預設尋找登陸指令碼的位置
如果需要修改該指令碼,需要手動定位到上面的路徑,
優點是指令碼集中放置
2、將登陸指令碼放在策略gpo所處的路徑下(在dc上的實體路徑類似於這樣
\\domainname\SysVol\domainname\Policies\{142B4268-9574-471F-9F7F-9AA04836F57F}\User\Scripts\Logon,這裡一長串的數字是gpo的guid,用來唯一的標識這個對象,
可以通過查詢該策略的屬性,來察看該guid)
在設定策略中登入指令檔的時候,此時是登陸域的時候預設尋找登陸指令碼的位置
如果需要修改該指令碼,可以點擊下方的“顯示檔案”
優點是和策略關聯性強,編輯尋找方便
無論用哪種方法,如果指令碼放置在預設的查詢路徑,指定登陸檔的時候就不用寫路徑
如果不是,就需要填寫完整路徑,當然這個路徑需要對於client可用,也就是說
不能填寫諸如 c:\winnt\sysvol\sysvol 這樣的路徑,否則client在登陸的時候,只會
在自己的機器上 c:\winnt\sysvol\sysvol 尋找指令碼,顯然是找不到的,因為指令碼
是下載到本地執行的。
那麼我們先看看指令碼是否能夠在client上正確執行,
在client上 winkey+r,然後填入指令碼的路徑,比如 \\servername\netlogon\config.bat
執行一下,是否能夠等到正確的結果?
然後察看上面的位置中指定的路徑是否正確
如果是通過策略指定的登陸指令碼,我們再用 gpresult /v ,察看一下client是否應用到了
您制定的策略,如果沒有就要考慮使用 dssite.msc 手動同步域中的所有dc,然後
secedit /refreshpolicy user_policy (machine_policy)/enforce 強制重新整理策略,
然後client重新登陸或者重新啟動一下(這取決於您制訂的是使用者登陸指令碼還是電腦登陸指令碼)
如果還是不行,那麼在早先的那篇文章有提到,
有可能是由於本地已經map 了同樣盤符的盤,導致衝突
有可能是由於map的共用路徑使用權限設定錯誤,常見的是共用許可權的設定問題
有可能是由於map的共用是跨平台的存放裝置或者格式,它們可能不能在登陸時在系統要求的
時間內響應,這導致系統認為該資源逾時串連,不可用。您可以嘗試更換netbios名稱或者ip
看看是否有所改善。
如果您還有問題,歡迎您繼續討論!
這個faq,我將同步更新在
http://www.winmag.com.cn/forum/itemdisplay.asp?boardid=24&id=393362
同時,您也可以參考 《HOW TO:在 Windows 2000 中分配指令碼》http://support.microsoft.com/kb/322241/zh-cn