В корпоративной среде Microsoft сетей использование скриптов в NETLOGON является не просто полезным, но необходимым условием.
Так что же с ними, скриптами, делать? Как говорил один профессор по дифурам - "Это же элементарно!".
Начало
В первую очередь нужно понять - что это такое? NETLOGON скрипты - это обычные CMD файлы, но запускаемые при запуске либо компьютера либо при входе пользователя в систему. Я в основном использую только второй вариант, его вполне достаточно, хотя иногда возникают ситуации когда без первого варианта не обойтись (когда нужны права администратора).
Присвоение того или иного варианта делается в GPO, и об этом писать здесь я не буду, не та тема.
Во вторых - полезно когда исполняемый скрипт оставляет за собой след, а точнее лог. Делаем это следующим образом - создаем два файла: start.cmd
и start1.cmd
. Первый прописываем в GPO, а второй будет запускаться первым.
start.cmd
echo off
title LOGON SCRIPT
color 0a
cls
echo.
echo. EXECUTING LOGON SCRIPT
echo.
echo. LOG file created in # %USERPROFILE%\netlogon.log #
echo.
call %LOGONSERVER%\netlogon\start1.cmd > "%USERPROFILE%\netlogon.log" 2>&1
echo. DONE
rem # wait for 5 sec
echo 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 LOG
echo.
echo. %DATE% - %TIME%
echo.
echo. LOGON SERVER = %LOGONSERVER%
echo.
echo. USERNAME = %USERNAME%
echo.
echo //////////////////////////////////////////
Синхронизируем время, самая частая проблема - разбег во времени у компьютеров и серверов приводит к невозможности авторизоваться пользователю на сервере.
echo.
echo --------- Time Sync
net time %LOGONSERVER% /set /y
Можно применить какие-нибудь изменения и/или обновления.
echo.
echo --------- Patch
echo * Time Patch
call %LOGONSERVER%\netlogon\patch.cmd
Подключить сетевые диски (об этом скрипте далее).
echo.
echo --------- SHARES
CScript.exe //Nologo "%LOGONSERVER%\netlogon\global\share.vbs"
Если есть сервер обновлений (WSUS), можно применить тонкие настройки.
echo.
echo --------- WUS settings - turn off user access to WinUpdate
regedit /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_2
IF %USERNAME%=="Registrator 1" GOTO proxy_2
IF %USERNAME%=="Registrator 2" GOTO proxy_2
IF %USERNAME%==superadmin GOTO proxy_3
:proxy_1
echo.
echo --------- MS FW Client config (auto)
"%LOGONSERVER%\netlogon\global\fwctool" SetAutoDetectServer
"%LOGONSERVER%\netlogon\global\fwctool" Enable
echo.
echo --------- IE Proxy Settings (172.30.8.10)
regedit /S %LOGONSERVER%\NETLOGON\global\ie.reg
GOTO end_prox
:proxy_2
echo.
echo --------- MS FW Client config (192.168.0.9)
"%LOGONSERVER%\netlogon\global\fwctool" SetManualServer /server 192.168.0.9
"%LOGONSERVER%\netlogon\global\fwctool" Enable
echo.
echo --------- IE Proxy Settings (192.168.0.9)
regedit /S %LOGONSERVER%\NETLOGON\global\ie2.reg
GOTO end_prox
:proxy_3
echo.
echo --------- MS FW Client config (NULL)
echo.
echo --------- IE Proxy Settings (NULL)
GOTO end_prox
:end_prox
Принудительно обновляем GPO у компьютера и пользователя
rem echo.
rem echo --------- GPO Update Force
gpupdate /force
Собственно и все, но тут могут быть вариации, или как у кого фантазия работает, или нужда какая.
share.vbs
Данный скрипт вызывается из CMD и так же, все что будет "говорить" нам он, будет зафиксировано в логе.
Основной особенностью данного скрипта является то, что он не просто подключает некие статические диски, что можно и напрямую сделать из CMD файла, но данный скрипт подключает диски в зависимости от принадлежности пользователя к группам домена. Так же как и предыдущий, данный скрипт подробно расписывать не буду, т.к. в самом коде достаточно комментариев, чтобы разобраться в нем.
On Error Resume Next
Set objSysInfo = CreateObject("ADSystemInfo")
Set objNetwork = CreateObject("Wscript.Network")
strUserPath = "LDAP://" & objSysInfo.UserName
Set 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)
NEXT
wscript.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 Select
Next
wscript.echo " |** All Network Drives Connected ***"
wscript.echo "****"