Автор: alecsandrb
Дата сообщения: 10.07.2007 08:58
PIL123
Ну вот получилось что-то работающее, правда пришлось разбить скрипт на две части.
Первая дабавляет в реестр ПК запись с описанием и перезапускает службу Сервер,
а вторая часть читает строку из реестра и записывает в АД. Первая часть написана на AutoIt3.
Еще нужно дать разрешение для пользователей домена на изменение ветки реестра
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters в групповой политике.
Первый скрипт компилируется (не забудь исправить имя пользователя под которым запускается перезапуск службы Сервер и запуск второй части скрипта и имя или IP адресс контроллера домена) и вставляется в логон-скрипты, а ворой положить на шару netlogon на контроллере домена, вот вроде и все.
Скрипт №1 (DescriptionPC.au3):
[more]
; добавляем описание константы - путь в реестре для описания ПК
Local Const $HKLM_DESCR = "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters"
; Добавляем описание функции для чтения данных из АД
; Будет возвращена строка типа:
; cn=Ivan Ivanov,OU=IT,OU=USERS,OU=KOR,OU=CEM,DC=RR,DC=TT,DC=NNNNNN,DC=MMM|cn=PCVASYA,OU=Workstation,OU=KOR,OU=CEM,DC=RR,DC=TT,DC=NNNNNN,DC=MMM
Local $Code = ""
$Code &= 'Function ReadAD()' & @LF
$Code &= ' Dim WshNetwork, objSysInfo, strComputerDN, objComputer, strUserDN, objUser' & @LF
$Code &= ' Set objSysInfo = CreateObject("ADSystemInfo")' & @LF
$Code &= ' strComputerDN = objSysInfo.computerName' & @LF
$Code &= ' Set WshNetwork = CreateObject("WScript.Network")' & @LF
$Code &= ' strUserDN = objSysInfo.userName' & @LF
$Code &= ' ReadAD = strComputerDN & "|" & strUserDN' & @LF
$Code &= 'End Function' & @LF
; вызов функции чтения данных о ПК и пользователе
Local $VbsObj = ObjCreate("ScriptControl")
$VbsObj.Language = "vbscript"
$VbsObj.AddCode($Code)
Local $DescriptionStr = $VbsObj.Run("ReadAD")
; Результат следующих действий:
; $DescriptionStr = cn=Ivan Ivanov,OU=IT,OU=USERS,OU=KOR,OU=CEM,DC=RR,DC=TT,DC=NNNNNN,DC=MMM|cn=PCVASYA,OU=Workstation,OU=KOR,OU=CEM,DC=RR,DC=TT,DC=NNNNNN,DC=MMM
$mmm = StringInStr($DescriptionStr, "|") - 1
; $mmm = 72
$strComputerDN = StringMid($DescriptionStr, 1,$mmm)
; $strComputerDN = cn=Ivan Ivanov,OU=IT,OU=USERS,OU=KOR,OU=CEM,DC=RR,DC=TT,DC=NNNNNN,DC=MMM
$strUserDN = StringMid($DescriptionStr, $mmm + 2 )
; $strUserDN = cn=PCVASYA,OU=Workstation,OU=KOR,OU=CEM,DC=RR,DC=TT,DC=NNNNNN,DC=MMM
; Далее получаем информацию в каком OU расположена учетка пользователя (для меня это название отдела)
; Заполняем массив $myArray значениями из строки $strUserDN, концом для текущего значения будет <,>
$myArray = StringSplit($strUserDN, ",")
; Далее перебираем весь массив и все значения в которых есть строка с <OU=> собираем в одну строку $Path
$Path = ""
For $rec In $myArray
If StringLeft($rec, 3) = "CN=" Then
$UserName = StringMid($rec, 4)
EndIf
If StringInStr($rec, "OU=") > 0 Then
$Path = StringMid($rec, 4) & $Path
EndIf
Next
; Path="CEMKORUSERSIT"
$DepartmentPath = StringMid($Path, 12)
; $DepartmentPath = "IT"
; Далее получаем информацию в каком OU расположена учетка ПК (у меня разнесены учетки ПК, ноутбуков и серверов по разным OU)
; Заполняем массив $myArray значениями из строки $strUserDN, концом для текущего значения будет <,>
$myArray = StringSplit($strComputerDN, ",")
; Далее перебираем весь массив и все значения в которых есть строка с <OU=> собираем в одну строку $Path
$Path = ""
For $rec In $myArray
If StringLeft($rec, 3) = "OU=" Then
$Path = StringMid($rec, 4) & $Path
EndIf
Next
; Path="CEMKORWorkstation"
$OUCompPath = StringMid($Path, 7)
; $OUCompPath = "Workstation"
$Code3 = $OUCompPath & " " & $DepartmentPath & " " & $UserName & " " & @MDAY & "." & @MON & "." & @YEAR & " "& @HOUR & ":" & @MIN
; Описание будет следующего вида:
; Workstation IT Ivan Ivanov 9.07.2007 8:00
; Создаем раздел для в реестре под описание ПК
RegWrite($HKLM_DESCR, 'srvcomment', 'REG_SZ', "")
; Записываем полученное значение
RegWrite($HKLM_DESCR, 'srvcomment', 'REG_SZ', $Code3)
; Запускаем все остальные действия под учеткой Domain admins
RunAsSet('Имя пользователя - Domain admins', 'Имя домена', 'Пароль')
; Далее запускаем несколько Дос сессий в скрытом режиме
; Запуск второй части скрипта
$StrCmd1 = @SystemDir & '\cscript.exe \\имя контроллера домена или его IP адресс\netlogon\OpisaniePC.vbs'
RunWait($StrCmd1, @SystemDir, @SW_HIDE)
; Останавливаем службу Сервер и все от нее зависящие службы
$StrCmd = @SystemDir & '\net.exe stop lanmanserver /y'
RunWait($StrCmd, @SystemDir, @SW_HIDE)
; Пауза
Sleep(100)
; Заново запускаем службу Сервер
$StrCmd2 = @SystemDir & '\net.exe start lanmanserver /y'
RunWait($StrCmd2, @SystemDir, @SW_HIDE)
; Возвращаемся к учетке залогиневшегося пользователя
RunAsSet()
[/more]
Скрипт №2 (OpisaniePC.vbs):
[more]
Option Explicit
Dim objSysInfo, strComputerDN, objComputer, WshShell, WshNetwork
Dim DescriptionStr
On Error Resume Next
' Получаем данные о ПК на котором зологинился пользователь
Set objSysInfo = CreateObject("ADSystemInfo")
strComputerDN = objSysInfo.computerName
Set objComputer = GetObject("LDAP://" & strComputerDN)
Set WshShell = Wscript.CreateObject("WScript.Shell")
Set WshNetwork = CreateObject("WScript.Network")
' Читаем из реестра описание ПК и пользователя сформированное первым скриптом
DescriptionStr = WshShell.RegRead("HKLM\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters\srvcomment")
' Записываем данные в АД в свойсво Description
objComputer.Put "Description" , DescriptionStr
objComputer.SetInfo
[/more]