|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Скрипт не вводит ПК в домен |
|
|
VBS/WSH/JS - [решено] Скрипт не вводит ПК в домен
|
Новый участник Сообщения: 15 |
Имеется следующий скрипт, который благополучно отрабатывает, под администратором на удаленном Пк, успешно выводит запись в лог, но компьютеры в домен не попадают. Подскажите в чем проблема?
'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 |
|
Отправлено: 18:55, 18-08-2009 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Castor, для начала закомментируй/удали строчку "On error resume next" и проверь на предмет возникающих в процессе работы скрипта ошибок
|
Отправлено: 11:30, 19-08-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 35
|
Профиль | Сайт | Отправить PM | Цитировать 1. закоментируйте игнорирование ошибок On error resume next и посмотрите что получится.
2. разбейте скрипт на части. для начала на "до перезагрузки" и "после". проверяйте, что бы все работало в первой части, потом добавьте вторую. короче говоря, локализируйте проблему |
------- Отправлено: 12:40, 19-08-2009 | #3 |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать Появилась первая ошибка
C:\scripts\vvod_v_domen.vbs(63, 1) SWbemLocator: Отказано в доступе. Ругается на строку - ReturnValue = objSWbemLocator.ConnectServer(strComputer, _ "root\cimv2", _ strLocalUser, _ strLocalPasswd) Хотя попасть на ПК из группы, которую нужно ввести в домен можно, из командной строки тоже. |
Отправлено: 13:17, 19-08-2009 | #4 |
Новый участник Сообщения: 35
|
Профиль | Сайт | Отправить PM | Цитировать у вас в скрипте не одна такая строка
![]() strLocalUser strLocalPasswd содержат правильные данные? юзера с правами локального админа на удаленной машине ? если речь о "Проверка админского пароля" попробуйте вообще закоментить этот блок. |
|
------- Отправлено: 14:26, 19-08-2009 | #5 |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать |
Отправлено: 17:15, 19-08-2009 | #6 |
Новый участник Сообщения: 35
|
Профиль | Сайт | Отправить PM | Цитировать а вам обязательно удаленно компы в домен вводить?
|
------- Отправлено: 18:11, 19-08-2009 | #7 |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать Цитата verna:
Ожидается 15 новых ПК с предустановленной системой для филиала. Желательно скриптить, иначе командировка. |
|
Отправлено: 18:35, 19-08-2009 | #8 |
Новый участник Сообщения: 35
|
Профиль | Сайт | Отправить PM | Цитировать Цитата verna:
(например http://gallery.technet.microsoft.com...a-16d8339b60f1) дабл клик может сделать любой сотрудник филиала. а про objSWbemLocator.ConnectServer я почитал. много ругаются на эту же ошибку и ни одного решения конкретного. |
|
------- Отправлено: 11:03, 20-08-2009 | #9 |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать Разобрались общими усилиями с доступом, но усилия того стоят.
1. Оказалось дело в правах пользователя SYSTEM. Мой скрипт коннектится к машине с локальным логином и паролем, но потом начинает работать WMI, который запущен от имени SYSTEM удаленного ПК. А пользователю SYSTEM по умолчанию доступ в сеть запрещен.(решается через ГП) 2. В оснастке wmimgmt.msc -свойства-безопастность, пользователя SYSTEM по умолчанию нет. И... все работает. Тему можно считать закрытой. |
Отправлено: 15:23, 20-08-2009 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Intel вводит ''звездный'' рейтинг для своих процессоров | OSZone News | Новости железа | 7 | 12-05-2009 18:24 | |
Microsoft вводит поддержку Open Document Format в MS Office | OSZone News | Новости и события Microsoft | 10 | 22-12-2008 16:33 | |
Разное - Avast вводит в заблуждения. Показывает чего-то не то. | verdix | Microsoft Windows Vista | 7 | 08-07-2008 14:46 | |
[решено] Скрипт справочника | Artem-Samsung | Вебмастеру | 2 | 19-06-2008 17:14 | |
[решено] ява скрипт | jokeroto | Вебмастеру | 6 | 16-01-2008 19:45 |
|