Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Скрипт не вводит ПК в домен (http://forum.oszone.net/showthread.php?t=148304)

Castor 18-08-2009 18:55 1196864

Скрипт не вводит ПК в домен
 
Имеется следующий скрипт, который благополучно отрабатывает, под администратором на удаленном Пк, успешно выводит запись в лог, но компьютеры в домен не попадают. Подскажите в чем проблема?
Код:

'Cкрипт для подключения к домену компьютеров. (VBScript)

'///////////////////////////////////////////////////////////////////////////////////////////////////////

' AutoJoin.vbs
' Этот скрипт подключает к домену компьютеры рабочей группы из списка
' computers.txt добавляя их в определенный организационный юнит Active
' Directory, используя удаленное подключение к WMI под учетными данными
' локального администратора этих рабочих станций, а также вносит
' изменения в реестре для смены дефолтного имени домена при входе в
' систему, меняет DNS, SID с последующей перезагрузкой.
' Заранее создаем ОГП , ниже вводим имя домена и ОГП, также адрес DNS
' сервера
' программу newsid - от Sysinternals в System32
' и программу moveuser из WinResKit для W2k3
'
'//////////////////////////////////////////////////////////////////////////////////////////////////////
'меняем нижеприведенные данные на свои
'локального админа на ПК в группе
'и данные учетки пользователя с правами админа домена
strLocalUser = "Administrator"
strLocalPasswd = "password"
strDomain = "local.loc"
strDomainUser = "Administrator@local.loc"
strDomainPasswd = "password_adm_domena"

Const JOIN_DOMAIN = 1
Const ACCT_CREATE = 2
Const ACCT_DELETE = 4
Const WIN9X_UPGRADE = 16
Const DOMAIN_JOIN_IF_JOINED = 32
Const JOIN_UNSECURE = 64
Const MACHINE_PASSWORD_PASSED = 128
Const DEFERRED_SPN_SET = 256
Const INSTALL_INVOCATION = 262144
' здесь вводим созданный ОГП для нового ПК и имя домена
Const strOU = "ou=Manage, dc=local, dc=loc"
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_CURRENT_USER = &H80000001

Dim objFile, objIE, objFiles, objFSO, ForAppending, objExcel, objWorkbook, objClass, objServices
ForAppending = 8



Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTS = objFSO.OpenTextFile("computers.txt")
Set objFile = objFSO.OpenTextFile("log.txt", ForAppending, False)

Do Until objTS.AtEndOfStream
On error resume next

strComputer = objTS.ReadLine

WScript.Echo "_" & Now & "___________________________________________________________" & vbCrLf
WScript.Echo "Рабочая станция " & strComputer & " подключается к домену " & strDomain & vbCrLf

'///////////////////////////////////////
'Проверка админского пароля
'///////////////////////////////////////

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
ReturnValue = objSWbemLocator.ConnectServer(strComputer, _
"root\cimv2", _
strLocalUser, _
strLocalPasswd)
if ReturnValue = 0 then
WScript.Echo " - выбран основной админский пароль"
Else
strLocalPasswd = "dop_passw"
WScript.Echo " - выбран дополнительный админский пароль"
End If

'///////////////////////////////////////////////
'Копирование необходимых файлов
'///////////////////////////////////////////////

WScript.Echo " - подготовка файлов для выполнения операций"

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _
"root\cimv2", _
strLocalUser, _
strLocalPasswd)

Set colFolders = objSWbemServices.ExecQuery("SELECT * FROM Win32_Directory WHERE Name = 'С:\Utils'")
For Each objFolder In colFolders
objFolder.Copy "C:\Temp\"
Next


'/////////////////
'Смена SID'a
'/////////////////


Dim strSid
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
objSWbemLocator.Security_.Privileges.AddAsString("SeSecurityPrivilege")
Set objWMIService = objSWbemLocator.ConnectServer(strComputer, _
"root\cimv2", _
strLocalUser, _
strLocalPasswd, _
"", _
"", _
&H80)

Set objReg = objSWbemLocator.ConnectServer(strComputer, _
"root\default", _
strLocalUser, _
strLocalPasswd, _
"", _
"", _
&H80)
Set oReg = objReg.Get("StdRegProv")

strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx"
oReg.CreateKey HKEY_LOCAL_MACHINE,strKeyPath
strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx"
strValueName = "SidChange"
strValue = "newsid.bat"
oReg.SetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue

objReg.GetStringValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx", "SidChange", strSid

WScript.Echo " - SID будет изменен при следующей перезагрузке "

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objServices = objSWbemLocator.ConnectServer(strComputer, _
"root\cimv2", _
strLocalUser, _
strLocalPasswd)

Set objClass = objServices.Get("Win32_Process")

WScript.Echo " - присваиваем компьютеру новый SID"

strRun = "newsid.exe /a"

Res = objClass.Create(strRun, Null, Null, PID)
WScript.Sleep 10000

If Res <> 0 Then
WScript.Echo " - смена SID завершена с ошибкой: " & Res
Else

WScript.Echo " - смена SID успешно завершена с процессом: " & PID
End If

'/////////////////
'Смена DNS
'/////////////////

Dim objNetCard
Dim colNetCards

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _
"root\cimv2", _
strLocalUser, _
strLocalPasswd)

Set colNetCards = objSWbemServices.ExecQuery("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")

For Each objNetCard in colNetCards

strDNSServer = Array("192.168.0.10")

objNetCard.SetDNSServerSearchOrder(strDNSServer)

Next

WScript.Echo " - корректировка DNS завершена"

'//////////////////////////////////////////////////
'Принудительное завершение сеанса
'//////////////////////////////////////////////////

WScript.Echo " - принудительное завершение сеанса"

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _
"root\cimv2", _
strLocalUser, _
strLocalPasswd)
Set colSwbemObjectSet = _
objSWbemServices.ExecQuery("Select * from Win32_OperatingSystem")

For Each objOS in colSWbemObjectSet
ObjOS.Win32Shutdown(4)
Next

WScript.Sleep 30000

'///////////////////////////////////////////////////////////
'Подключение к рабочей станции через WMI
'///////////////////////////////////////////////////////////

Set objWMILocator = CreateObject("WbemScripting.SWbemLocator")
objWMILocator.Security_.AuthenticationLevel = 6
Set objWMIComputer = objWMILocator.ConnectServer(strComputer, _
"root\cimv2", _
strLocalUser, _
strLocalPasswd)
Set objWMIComputerSystem = objWMIComputer.Get( _
"Win32_ComputerSystem.Name='" & _
strComputer & "'")

'//////////////////////////////////////////
'Ввод рабочей станции в домен
'//////////////////////////////////////////

WScript.Echo " - ввод рабочей станции в домен"


ReturnValue = objWMIComputerSystem.JoinDomainOrWorkGroup(strDomain, _
strDomainPasswd, _
strDomainUser, _
strOU, _
JOIN_DOMAIN + ACCT_CREATE)

'/////////////////////////////////////////
'Вывод отчетов и логирование
'/////////////////////////////////////////

If ReturnValue = 5 then
objFile.Write " [" & Now & "] " & strComputer & " | Ошибка: Отсутствует доступ на добавление компьютера в домен" & vbCrLf
WScript.Echo " - отсутствует доступ на добавление компьютера в домен"

End If
If ReturnValue = 2224 then
objFile.Write " [" & Now & "] " & strComputer & " | Ошибка: Компьютер уже находится в домене" & vbCrLf
WScript.Echo " - компьютер уже находится в домене"

End If
if ReturnValue > 2691 then
objFile.Write " [" & Now & "] " & strComputer & " | Компьютер успешно добавлен в домен" & vbCrLf
WScript.Echo " - компьютер успешно добавлен в домен"

Else
objFile.Write " [" & Now & "] " & strComputer & " | Компьютер успешно добавлен в домен" & vbCrLf
WScript.Echo " - компьютер успешно добавлен в домен"

End if

'//////////////////////////////////////////////////////////////////////////////
'Изменение дефолтного имени домена при входе в систему
'//////////////////////////////////////////////////////////////////////////////

WScript.Echo " - изменение дефолтного имени домена при входе в систему"
WScript.Sleep 5000

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
objSWbemLocator.Security_.Privileges.AddAsString("SeSecurityPrivilege")
Set objWMIService = objSWbemLocator.ConnectServer(strComputer, _
"root\cimv2", _
strLocalUser, _
strLocalPasswd, _
"", _
"", _
&H80)

Set objReg = objSWbemLocator.ConnectServer(strComputer, _
"root\default", _
strLocalUser, _
strLocalPasswd, _
"", _
"", _
&H80)
Set oReg = objReg.Get("StdRegProv")

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
oReg.SetStringValue HKEY_LOCAL_MACHINE, strKeyPath, _
"DefaultDomainName",strDomain

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
oReg.SetStringValue HKEY_LOCAL_MACHINE, strKeyPath, _
"AltDefaultDomainName",strDomain

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
oReg.SetStringValue HKEY_LOCAL_MACHINE, strKeyPath, _
"CachePrimaryDomain",strDomain

'//////////////////////////////////////////////////
'Перемещение профиля пользователя
'//////////////////////////////////////////////////

Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
objSWbemLocator.Security_.Privileges.AddAsString("SeSecurityPrivilege")
Set objWMIService = objSWbemLocator.ConnectServer(strComputer, _
"root\cimv2", _
strLocalUser, _
strLocalPasswd, _
"", _
"", _
&H80)

Set objReg = objSWbemLocator.ConnectServer(strComputer, _
"root\default", _
strLocalUser, _
strLocalPasswd, _
"", _
"", _
&H80)
Set oReg = objReg.Get("StdRegProv")

strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
oReg.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, _
"DefaultUserName",strUser

'On Error Resume Next
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")

Set objServices = objSWbemLocator.ConnectServer(strComputer, _
"root\cimv2", _
strLocalUser, _
strLocalPasswd)

Set objClass = objServices.Get("Win32_Process")

WScript.Echo " - запуск перемещения локального профиля пользователя " & strUser & " в домен " & strDomain
WScript.Sleep 10000

MoveUser = "moveuser.exe " & strUser & " " & strDomain & "\" & strUser & " /y /k 1>c:\logmu.txt 2>c:\errmu.txt"
strRun = "cmd.exe /c " & chr(34) & "" & MoveUser & "" & chr(34) &""

Res = objClass.Create(strRun, Null, Null, PID)

If Res <> 0 Then
WScript.Echo " - перемещение профиля пользователя завершено с ошибкой: " & Res
Else
WScript.Echo " - перемещение завершено"

End If

WScript.Sleep 20000

'/////////////////////////////////////////////
'Перезагрузка удаленной машины
'/////////////////////////////////////////////

WScript.Echo " - перезагрузка рабочей станции"


Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer(strComputer, _
"root\cimv2", _
strLocalUser, _
strLocalPasswd)
Set colSwbemObjectSet = _
objSWbemServices.ExecQuery("Select * from Win32_OperatingSystem")

For Each objOS in colSWbemObjectSet
ObjOS.Win32Shutdown(2)
Next

WScript.Echo " - операции AutoJoin с " & strComputer & " завершены." & vbCrLf

Loop
objFile.Close
objTS.Close


amel27 19-08-2009 11:30 1197327

Castor, для начала закомментируй/удали строчку "On error resume next" и проверь на предмет возникающих в процессе работы скрипта ошибок

verna 19-08-2009 12:40 1197390

1. закоментируйте игнорирование ошибок On error resume next и посмотрите что получится.

2. разбейте скрипт на части. для начала на "до перезагрузки" и "после". проверяйте, что бы все работало в первой части, потом добавьте вторую. короче говоря, локализируйте проблему

Castor 19-08-2009 13:17 1197420

Появилась первая ошибка
C:\scripts\vvod_v_domen.vbs(63, 1) SWbemLocator: Отказано в доступе.

Ругается на строку -

ReturnValue = objSWbemLocator.ConnectServer(strComputer, _
"root\cimv2", _
strLocalUser, _
strLocalPasswd)

Хотя попасть на ПК из группы, которую нужно ввести в домен можно, из командной строки тоже.

verna 19-08-2009 14:26 1197483

у вас в скрипте не одна такая строка :)


strLocalUser
strLocalPasswd

содержат правильные данные? юзера с правами локального админа на удаленной машине ?

если речь о "Проверка админского пароля" попробуйте вообще закоментить этот блок.

Castor 19-08-2009 17:15 1197621

Цитата:

Цитата verna
содержат правильные данные? юзера с правами локального админа на удаленной машине ? »

Все данные вводятся правильно.

Цитата:

Цитата verna
если речь о "Проверка админского пароля" попробуйте вообще закоментить этот блок. »

Пробовал - выдает ошибки в следующем блоке и так до конца скрипта.

verna 19-08-2009 18:11 1197647

а вам обязательно удаленно компы в домен вводить?

Castor 19-08-2009 18:35 1197659

Цитата:

Цитата verna
а вам обязательно удаленно компы в домен вводить? »


Ожидается 15 новых ПК с предустановленной системой для филиала. Желательно скриптить, иначе командировка.

verna 20-08-2009 11:03 1198148

Цитата:

Цитата verna
а вам обязательно удаленно компы в домен вводить? »

тут дело в том, что есть 100% работающие скрипты для воода в домен с локальным запуском.
(например http://gallery.technet.microsoft.com...a-16d8339b60f1)

дабл клик может сделать любой сотрудник филиала.

а про objSWbemLocator.ConnectServer я почитал. много ругаются на эту же ошибку и ни одного решения конкретного.

Castor 20-08-2009 15:23 1198415

Разобрались общими усилиями с доступом, но усилия того стоят.

1. Оказалось дело в правах пользователя SYSTEM. Мой скрипт коннектится к машине с локальным логином и паролем, но потом начинает работать WMI, который запущен от имени SYSTEM удаленного ПК. А пользователю SYSTEM по умолчанию доступ в сеть запрещен.(решается через ГП)

2. В оснастке wmimgmt.msc -свойства-безопастность, пользователя SYSTEM по умолчанию нет.

И... все работает.

Тему можно считать закрытой.

mem129 20-11-2011 17:59 1799361

Castor, нужна ваша помощь... вы ещё в теме?


Время: 16:19.

Время: 16:19.
© OSzone.net 2001-