В корпоративной среде Microsoft сетей использование скриптов в NETLOGON является не просто полезным, но необходимым условием.
Так что же с ними, скриптами, делать? Как говорил один профессор по дифурам - "Это же элементарно!".
Начало
В первую очередь нужно понять - что это такое? NETLOGON скрипты - это обычные CMD файлы, но запускаемые при запуске либо компьютера либо при входе пользователя в систему. Я в основном использую только второй вариант, его вполне достаточно, хотя иногда возникают ситуации когда без первого варианта не обойтись (когда нужны права администратора).
Присвоение того или иного варианта делается в GPO, и об этом писать здесь я не буду, не та тема.
Во вторых - полезно когда исполняемый скрипт оставляет за собой след, а точнее лог. Делаем это следующим образом - создаем два файла: start.cmd и start1.cmd. Первый прописываем в GPO, а второй будет запускаться первым.
start.cmd
echo offtitle LOGON SCRIPTcolor 0aclsecho.echo. EXECUTING LOGON SCRIPTecho.echo. LOG file created in # %USERPROFILE%\netlogon.log #echo.call %LOGONSERVER%\netlogon\start1.cmd > "%USERPROFILE%\netlogon.log" 2>&1echo. DONErem # wait for 5 sececho Wscript.Sleep 5000 > "%USERPROFILE%\sleep.vbs"CScript.exe //Nologo "%USERPROFILE%\sleep.vbs"del /F /Q "%USERPROFILE%\sleep.vbs"В итоге исполнение основного скрипта start1.cmd будет зафиксировано в логе, что поможет на этапе отладки и в случае возникновения проблем в дальнейшем - понять, что же пошло не так...
start1.cmd
Для начала фиксируем в логе: дату, сервер авторизации, имя пользователя
echo.echo. LOGON LOGecho.echo. %DATE% - %TIME%echo.echo. LOGON SERVER = %LOGONSERVER%echo.echo. USERNAME = %USERNAME%echo.echo //////////////////////////////////////////Синхронизируем время, самая частая проблема - разбег во времени у компьютеров и серверов приводит к невозможности авторизоваться пользователю на сервере.
echo.echo --------- Time Syncnet time %LOGONSERVER% /set /yМожно применить какие-нибудь изменения и/или обновления.
echo.echo --------- Patchecho * Time Patchcall %LOGONSERVER%\netlogon\patch.cmdПодключить сетевые диски (об этом скрипте далее).
echo.echo --------- SHARESCScript.exe //Nologo "%LOGONSERVER%\netlogon\global\share.vbs"Если есть сервер обновлений (WSUS), можно применить тонкие настройки.
echo.echo --------- WUS settings - turn off user access to WinUpdateregedit /S %LOGONSERVER%\NETLOGON\global\wu.regДалее, если выход в Интернет осуществляется не через один прокси сервер, а через парочку или кому-то нужны отличные от стандартных настройки, или кому-то нужно прописывать домашнюю страничку на Интрасайт, а кому-то нет, короче, если на основании только имени пользователя нужно немного волшебства, то дальше применяем следующую процедуру.
Кстати, кому надо - была утилита на офсайте Firewall Client Tool for ISA Server 2004 (FwcTool.exe) (support.microsoft.com/kb/886993).
IF %USERNAME%==Dispetcher GOTO proxy_2IF %USERNAME%=="Registrator 1" GOTO proxy_2IF %USERNAME%=="Registrator 2" GOTO proxy_2IF %USERNAME%==superadmin GOTO proxy_3:proxy_1echo.echo --------- MS FW Client config (auto)"%LOGONSERVER%\netlogon\global\fwctool" SetAutoDetectServer"%LOGONSERVER%\netlogon\global\fwctool" Enableecho.echo --------- IE Proxy Settings (172.30.8.10)regedit /S %LOGONSERVER%\NETLOGON\global\ie.regGOTO end_prox:proxy_2echo.echo --------- MS FW Client config (192.168.0.9)"%LOGONSERVER%\netlogon\global\fwctool" SetManualServer /server 192.168.0.9"%LOGONSERVER%\netlogon\global\fwctool" Enableecho.echo --------- IE Proxy Settings (192.168.0.9)regedit /S %LOGONSERVER%\NETLOGON\global\ie2.regGOTO end_prox:proxy_3echo.echo --------- MS FW Client config (NULL)echo.echo --------- IE Proxy Settings (NULL)GOTO end_prox:end_proxПринудительно обновляем GPO у компьютера и пользователя
rem echo.rem echo --------- GPO Update Forcegpupdate /forceСобственно и все, но тут могут быть вариации, или как у кого фантазия работает, или нужда какая.
share.vbs
Данный скрипт вызывается из CMD и так же, все что будет "говорить" нам он, будет зафиксировано в логе.
Основной особенностью данного скрипта является то, что он не просто подключает некие статические диски, что можно и напрямую сделать из CMD файла, но данный скрипт подключает диски в зависимости от принадлежности пользователя к группам домена. Так же как и предыдущий, данный скрипт подробно расписывать не буду, т.к. в самом коде достаточно комментариев, чтобы разобраться в нем.
On Error Resume NextSet objSysInfo = CreateObject("ADSystemInfo")Set objNetwork = CreateObject("Wscript.Network")strUserPath = "LDAP://" & objSysInfo.UserNameSet objUser = GetObject(strUserPath)Dim driveleter driveleter = Array("J:","K:","L:","M:","N:","O:","P:","Q:","R:","S:","T:")' Отключаем имеющиеся сетевые дискиwscript.echo "****"wscript.echo " |** Removing Network Disks ***"FOR jj = 0 TO UBound(driveleter,1) objNetwork.RemoveNetworkDrive driveleter(jj)NEXTwscript.echo " |++ Done" ii=1' Приватная папка пользователя wscript.echo " |** Connecting Privet Network Drives ***" objNetwork.MapNetworkDrive "I:", "\\server-DCS\" & objUser.sAMAccountName & "$"' Подключается всем пользователям wscript.echo " |** Connecting Publish Network Drives ***" objNetwork.MapNetworkDrive "X:", "\\server-store1\all" objNetwork.MapNetworkDrive "Y:", "\\server-store1\install" wscript.echo " |++ Connected ALL & INSTALL on X: & Y:"' Подключение групповых дисковwscript.echo "*** Connecting Group Network Drives ***"For Each strGroup in objUser.MemberOf strGroupPath = "LDAP://" & strGroup Set objGroup = GetObject(strGroupPath) strGroupName = objGroup.CN wscript.echo " | " & strGroupName Select Case strGroupName Case "Buhgalters" objNetwork.MapNetworkDrive driveleter(ii), "\\server-buh\buhgalt" wscript.echo " |++ Connected on " & driveleter(ii) ii=ii+1 Case "buh_readonly_for_managers" objNetwork.MapNetworkDrive driveleter(ii), "\\server-buh\buhgalt\For_Managers" wscript.echo " |++ Connected on " & driveleter(ii) ii=ii+1 Case "Chief_share" objNetwork.MapNetworkDrive driveleter(ii), "\\server-buh\Chiefshare" wscript.echo " |++ Connected on " & driveleter(ii) ii=ii+1 Case "Managers" objNetwork.MapNetworkDrive driveleter(ii), "\\server-store2\share_1" wscript.echo " |++ Connected on " & driveleter(ii) ii=ii+1 objNetwork.MapNetworkDrive driveleter(ii), "\\server-store2\share_2" wscript.echo " |++ Connected on " & driveleter(ii) ii=ii+1 Case "WareHouse" objNetwork.MapNetworkDrive driveleter(ii), "\\server-store2\share_3" wscript.echo " |++ Connected on " & driveleter(ii) ii=ii+1 End SelectNext wscript.echo " |** All Network Drives Connected ***" wscript.echo "****"