NETLOGON

В корпоративной среде 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).

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 "****"


Comments