1

Тема: VBS переименование ПК в домене

Есть текстовый файл, содержащий строки; в строке, через запятую, текущее имя ПК в домене и новое.
Задача: запустить скрипт при логоне ПК в домене и переименовать ПК по найденному в файле вхождению.
Прошу помочь, собственно, с самим скриптом. Поиск что то не помог, только netdom предлагает использовать.

2

Re: VBS переименование ПК в домене

Гуглю уже второй час - один netdom рулит... Что за дела такие? При логоне в домене можно запустить скрипт от имени system, т.е. с админскими правами на данном ПК. Для переименования в домене нужны логин и пароль пользователя, обладающего нужными правами... ну что ж, можно забить их явно в скрипт, если очень надо.

3

Re: VBS переименование ПК в домене

Тестировал netdom - не работает. На всех сетевых ПК политиками отключено всё, что только можно, наверняка проблема в этом (в лог netdom пишет что не найден сетевой путь). Скриптом VBS на ПК можно сделать всё, что надо, только не знаю как. Прошу помощи!

4

Re: VBS переименование ПК в домене

Неужели ни у кого нет готового решения? Всё ещё актуально.

5

Re: VBS переименование ПК в домене

Актуально!!! Хоть совет дайте...

6 (изменено: Rom5, 2013-12-12 00:45:39)

Re: VBS переименование ПК в домене

А сколько ж машин в списке?

Может проще сделать пользователям рассылку, чтобы в связи с критично важными для их дальнейшей работы они обязательно связывались с Вами (или коллегами Вашими) с просьбой подключиться для переименования машины?

Или по списку машин задизейблить соответствующий список (например, партиями, если список большой) юзеров - юзер звонит-жалуется, а по ходу его разблокировки машину админкой и переименовываете


Или "приковать к станку" (т.е. к списку машин) нескольких админов - пускай внаглую подключаются и переименовывают.



p.s. по скрипту автоматизации ничего не скажу, т.к. такой необычной и разовой задачи лично у меня не было.


Нагуглил для Вас, вот, такое: Renaming of Computer's Name using VBScript


Dim WshNetwork : Set WshNetwork = WScript.CreateObject("WScript.Network")
Dim strOldComputerName : strOldComputerName = WshNetwork.ComputerName
Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
Dim strLog : strLog = "c:\log_renamePC.txt"

strComputerName = InputBox("Enter a new machine name for this computer:", "Rename Computer : " & strOldComputerName)
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2")
Set colComputers = objWMIService.ExecQuery ("Select Name from Win32_ComputerSystem")
For Each objComputer in colComputers
    On Error Resume Next
    Err.Clear
    intErrorCode = objComputer.Rename(strComputerName)
    If intErrorCode <> 0 OR Err.Number<>0 Then
        Dim sErr : sErr = Err.Description
        Set objOutputFile = fso.OpenTextFile(strLog, 8, true)
        objOutputFile.WriteLine( now() & vbTab & strOldComputerName & vbTab & strComputerName & vbTab & "Error: "  &_
            CStr(intErrorCode) & " -- " & sErr) 
        objOutputFile.Close
        Set objOutputFile = Nothing
        MsgBox "Error renaming computer. Error # " & intErrorCode & vbCrLf & sErr
    Else
        Set objOutputFile = fso.OpenTextFile(strLog, 8, true)
        objOutputFile.WriteLine( now() & vbTab & strOldComputerName & vbTab & strComputerName & vbTab & "OK" )
        objOutputFile.Close
        Set objOutputFile = Nothing
        MsgBox "Computer renamed. It will now reboot."
        objShell.Run "shutdown.exe -r -f -t 0"
    End If
Next

Я не тестировал скрипт (хотя и чуть подправил оригинальный) в домене и не знаю - подходит ли это для доменных машин. А, если подходит, то можно, например, создать батник, стартующий этот скрипт от имени у/з админа утилитой PsExec.exe, раскидать на машины: батник,  PsExec, скрипт и список (скрипт доработать до поиска в списке нового имени машины  по текущему имени + протоколирование работы для разбора полёта), организовать запуск батника.

WBR. Roman

7 (изменено: komr, 2013-12-12 13:33:10)

Re: VBS переименование ПК в домене

Попробовал - мой комп переименовался. Большое спасибо! Но у меня есть все права. Осталось придумать, как этот код запустить с нужными правами на клиентской машине.

Вариант с  утилитой PsExec.exe не подойдёт, т.к. для её работы надо чтобы на удаленном и локальном ПК функционировали службы «Сервер» и «Рабочая станция». У нас это всё выключено.

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

8 (изменено: Rom5, 2013-12-12 16:25:10)

Re: VBS переименование ПК в домене

Посмотрите примеры по ссылкам
VBScript: Trying to use different user credentials on remote machine
MSDN - SWbemLocator.ConnectServer method

WBR. Roman

9

Re: VBS переименование ПК в домене

Попробовал, выходит ошибка "сервер RPC не доступен".

10 (изменено: komr, 2013-12-12 18:13:31)

Re: VBS переименование ПК в домене

Код получился такой:

Dim WshNetwork : Set WshNetwork = WScript.CreateObject("WScript.Network")
Dim strOldComputerName : strOldComputerName = WshNetwork.ComputerName
Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
Dim strLog : strLog = "c:\log_renamePC.txt"
strComputerName = InputBox("Enter a new machine name for this computer:", "Rename Computer : " & strOldComputerName)

strUsername = "adm_pk"
strPassword = "xxxxxxx"
strNamespace = "root\cimv2"

'on error resume next
Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objwbemLocator.ConnectServer(strComputerName, strNamespace, strUser, strPassword)
objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy

if Err.Number <> 0 then
 WScript.Echo "Authentication failed: " & Err.Description
end if

Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2")
Set colComputers = objWMIService.ExecQuery ("Select Name from Win32_ComputerSystem")
For Each objComputer in colComputers
    On Error Resume Next
    Err.Clear
    intErrorCode = objComputer.Rename(strComputerName)
    If intErrorCode <> 0 OR Err.Number<>0 Then
        Dim sErr : sErr = Err.Description
        Set objOutputFile = fso.OpenTextFile(strLog, 8, true)
        objOutputFile.WriteLine( now() & vbTab & strOldComputerName & vbTab & strComputerName & vbTab & "Error: "  &_
            CStr(intErrorCode) & " -- " & sErr) 
        objOutputFile.Close
        Set objOutputFile = Nothing
        MsgBox "Error renaming computer. Error # " & intErrorCode & vbCrLf & sErr
    Else
        Set objOutputFile = fso.OpenTextFile(strLog, 8, true)
        objOutputFile.WriteLine( now() & vbTab & strOldComputerName & vbTab & strComputerName & vbTab & "OK" )
        objOutputFile.Close
        Set objOutputFile = Nothing
        MsgBox "Computer renamed. It will now reboot."
        objShell.Run "shutdown.exe -r -f -t 0"
    End If
Next

11 (изменено: Rom5, 2013-12-12 19:51:38)

Re: VBS переименование ПК в домене

komr пишет:

...
Вариант с  утилитой PsExec.exe не подойдёт, т.к. для её работы надо чтобы на удаленном и локальном ПК функционировали службы «Сервер» и «Рабочая станция». У нас это всё выключено.
...

Кстати, я не подразумевал запуск скрипта на удаленном ПК, а только лишь запуск с помощью PsExec на локальной машине командной строки с указанием логина-пароля другой учётки.

Например, что-то типа такого батника:


cd /d c:\kuku
psexec.exe /accepteula -u домен\vasia.pupkin -p Vasia_password "%windir%\system32\wscript.exe" "renamePC.vbs" 
WBR. Roman

12

Re: VBS переименование ПК в домене

Google....

Dim Name, Password, Username

Name = "iWS-011"

Password = "password"

Username = "domain\Administrator"

Set objWMIService = GetObject("Winmgmts:root\cimv2")

' Call always gets only one Win32_ComputerSystem object.

For Each objComputer in _

   objWMIService.InstancesOf("Win32_ComputerSystem")

       Return = objComputer.rename(Name,Password,Username)

       If Return <> 0 Then

'wscript.echo "Rename failed. Error Code = " & Err.Number

    Else

          'WScript.Echo "Rename succeeded." & _

              '" Reboot for new name to go into effect"

'wscript.echo "Successfully Changed Hostname"    

End If

Next
Времени не хватает... :-(

13

Re: VBS переименование ПК в домене

Евген пишет:

Google....

Евген, спасибо! Это то, что доктор прописал. Работает. Компики уже активно переименовываются.
Не очень понял, зачем там цикл в коде..., я ещё тот программист :-), но прикрутить анализ файла получилось. В понедельник выложу код, который у меня в итоге получился.

А Гугл да, видимо, такие вещи надо искать на англоязычных ресурсах. Учту.

14 (изменено: komr, 2013-12-19 11:23:15)

Re: VBS переименование ПК в домене

Получилось как то так (оформил процедурой в большом коде скрипта регистрации ПК):

' *** Процедура переименовывает ПК пользователя ********************************************************
Sub Rename_PC (HostName)
On Error Resume Next
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
strPathtoTextFile = "C:\Sbersign\" 'Путь к каталогу с файлом, содержащим имена ПК, подлежащие переименованию
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strPathtoTextFile & ";" & "Extended Properties=""text;HDR=YES;FMT=Delimited"""
objRecordset.Open "SELECT * FROM PC.csv", objConnection, adOpenStatic, adLockOptimistic, adCmdText 'Имя файла, содержащего имена ПК, подлежащие переименованию
Do Until objRecordset.EOF
    if HostName=objRecordset.Fields.Item("Old_Name_PC") then
        Name_PC = objRecordset.Fields.Item("New_Name_PC")
        Password = "пароль_пользователя"
        Username = "домен\пользователь"
        Set objWMIService = GetObject("Winmgmts:root\cimv2")
      ' Call always gets only one Win32_ComputerSystem object.
        For Each objComputer in objWMIService.InstancesOf("Win32_ComputerSystem")
            Return = objComputer.rename(Name_PC,Password,Username)
            If Return <> 0 Then
              Call WriteTOLogFile ( Now() & " ПК не переименован. Код ошибки = " & Err.Number)
              Exit Sub
            Else
              Call WriteTOLogFile ( Now() & " ПК успешно переименован. Необходима перезагрузка ПК.")
              Exit Sub
            End If
        Next
    end if
    objRecordset.MoveNext
Loop
Set objConnection = Nothing
Set objRecordSet = Nothing
End Sub

Работает на ура. Ещё раз - спасибо!

Кстати, работает на Windows 7. На Windows XP не работает. Не работает анализ файла. Переименование работает и на ХР.