Войти

Показать полную графическую версию : Скрипт для изменения свойств компьютера в AD


madmax24
16-11-2007, 09:50
Добрый.
Я хочу с помощью скрипта изменять поле Location у каждого компа в АД при его загрузке. Нашел на мелкасофте пример скрипта
Set objComputer = GetObject _
("LDAP://CN=comp1, OU=ABC, DC=domain, DC=ru")
objComputer.Put "Location" , "Building 37, Floor 2, Room 2133"
objComputer.SetInfo
Проблема в том, что в скрипте указывается имя компа. А в моем случае имя компа - величина переменная.
Вопрос: можно ли в этот скрипт вписать некое регулярное выражение, чтоб при загрузке компа вместо comp1 было вписано имя текущей машины?
Если да, то пример кода пожалуста набросайте.

amel27
16-11-2007, 11:23
ну если контейнер/домен вычислять не надо то можно просто восстановить значение переменной окружения:Set objWSHell = CreateObject("WScript.Shell")
COMP=objWSHell.ExpandEnvironmentStrings("%COMPUTERNAME%")

Set objComputer = GetObject _
("LDAP://CN=" & COMP, OU=ABC, DC=domain, DC=ru")
objComputer.Put "Location" , "Building 37, Floor 2, Room 2133"
objComputer.SetInfo

madmax24
16-11-2007, 11:40
amel27, спасибо, попробую твой скрипт, но я решил проблему по другому.
Итак, день мучений привел меня к такому вот результату
Set WshNetwork = CreateObject("WScript.Network")
On Error Resume Next
Path = WSHNetwork.ComputerName
Set objSysInfo = CreateObject("ADSystemInfo")
strComputerDN = objSysInfo.ComputerName

Set objComputer = GetObject("LDAP://" & strComputerDN)
objComputer.Put "Location" , "Building 37, Floor 2, Room 2133"
objComputer.SetInfo


п.с. Кстати, тут на радостях то своих не узрел, что у тебя в месте
CN=" & COMP »
скрипт скорее всего не отработает, потому что у меня при передаче в LDAP строковой переменной он выдавал ошибку...
(пробовал всевозможными вариантами, в том числе и с "" и без и по всякому). Но все равно спасибо.

madmax24
16-11-2007, 12:17
В общем я разочаровался немного в своем скрипте, ибо у него много ограничений и минусов....
Решил обозначить задачу с другой стороны: Как мне пробежать по OU и для каждого компа изменить свойство Location?
Я хочу запустить скрипт один раз(либо ооочень редко раз), чтобы он совершил нужные мне действия.
Собственно сама проблема заключается в том как мне получить список объектов компьютеров из OU.

HLT
16-11-2007, 13:01
Например, нужные компютеры находятся в OU test1 домена domain.local
Тогда для установки Location = "Far far away" нам нужна такая команда:

dsquery computer "OU=test1,DC=domain,DC=local" | dsmod computer -loc "Far far away"

Подробнее об этих командах в первоисточнике:
dsquery (http://technet2.microsoft.com/windowsserver/en/library/46ba1426-43fd-4985-b429-cd53d3046f011033.mspx?mfr=true)
dsmod (http://technet2.microsoft.com/windowsserver/en/library/3558c421-ba3d-4b8f-a107-b9058cc0f2861033.mspx?mfr=true)

madmax24
16-11-2007, 15:37
HLT, спасибо, это то что надо. Работает на ура! :)

madmax24
26-11-2007, 12:58
Решив проблему изменения свойств компьютера в АД, я решил и другую очень мне необходимую задачу - автоматический переезд принтеров на новый принт-сервер. Хочу поделиться накопленным опытом, мож кому пригодится.

Итак, список задач, которые я решал:
1. Заполнение свойства Location компьютера в АД
2. Удаление принтеров, подключенных со старого принт-сервера
3. Автоматическое подключение ближайшего принтера с нового принт-сервера при залогинивании пользователя
4. Все это в максимально автоматическом режиме, с помощью скриптов и групповых политик

На сайте http://networkdoc.ru существует вот эта (http://www.networkdoc.ru/windows-script-host-wsh-/avtomaticheskoe-podklyuchenie-printera-polzovat.html) статья, примерно описывающая мою задачу. Но в ней есть некоторые моменты, которые у меня не заработали, поэтому пришлось колхозить самому. В итоге я избавился от старого принт-сервера, а новые принтеры сами появляются у пользователя при залогинивании и дефолтным выставляется ближайший. Че еще добавить не знаю, поэтому просто опишу очередность работы скриптов.

Во-первых нам для географического отделения компьютеров потребуется заполнить поле Location, скрипт, которые это делает ниже

dsquery computer OU=XXX,DC=YYY,DC=com | dsmod computer -loc "XXX/Computer"

Он был описан выше, за что автору очередной респект! Фактически мы пробегаем по всему организационному подразделению и у всех компов меняем поле Location.
скрипт запускается один раз с рабочего места админа, я его загнал в батник.
Дальше, я завел на новом принт-сервере принтеры, заполнил и их поле Location(оно потребуется для определения одинаковых принтеров)

Во-вторых, чтобы у пользователя удалились принтеры со старого принт-сервера, я составил следующий скрипт

Set objFS = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
Set objNetwork = WScript.CreateObject("WScript.Network")

'Выполняем выбор всех установленных принтеров
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colInstalledPrinters = objWMIService.ExecQuery _
("Select * from Win32_Printer")

'Строка регулярного выражения для удаления принтера
strRegExp = "\\OLD_PRINT_SERVER"

'В цикле пробегаем по каждому найденому принтеру
For Each objPrinter in colInstalledPrinters
strStringToMatch = objPrinter.Name

Set objRE = New RegExp
objRE.Global = False
objRE.IgnoreCase = True
objRE.Pattern = strRegExp

'Если строка рег выражения входит в название принтера, то его удаляем
If objRE.Test(strStringToMatch)=True Then
objNetwork.RemovePrinterConnection strStringToMatch
Else

End If
Next

Работает он так: у пользователя производится выборка всех установленных принтеров, а дальше я ищу вхождение строки \\OLD_PRINT_SERVER в каждый принтер. Если она там есть, то принтер грохаю, иначе ничего. OLD_PRINT_SERVER каждый пишет СВОЙ!

В-третьих, из замечательной вышеуказанной статьи я взял скрипт, который автоматически ставит и проверяет установку ближайшего принтера. Еще раз приведу его здесь.

'Определяем контекст комьютера

Option Explicit
Dim WSHNetwork, Computer, Path, strComputerDN, objSysInfo, objComputer, sPrintPath, PrintLocation
Dim objWMIService, colInstalledPrinters, objPrinter
Set WSHNetwork = CreateObject("WScript.Network")
On Error Resume Next
Path = WSHNetwork.ComputerName
Set objSysInfo = CreateObject("ADSystemInfo")
strComputerDN = objSysInfo.ComputerName
Set objComputer = GetObject("LDAP://" & strComputerDN)

'Назначаем необходимый для установки сетевой принтер
'в зависимости от значения поля Location
Select Case objComputer.Get("Location")
Case "Отдел 1"
sPrintPath = "\\server1\HPLaserJ"
PrintLocation = "Принтер в Отделе 1"
Case "Отдел 2"
sPrintPath = "\\server2\HP1100"
PrintLocation = "Принтер HP1100 Отдел 2"
Case Else
MsgBox("Для установки принтера обратитесь к системному администратору.") :WScript.Quit
End Select

'Выполняем проверку установленных принтеров
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2")

Set colInstalledPrinters = objWMIService.ExecQuery _
("Select * from Win32_Printer")

For Each objPrinter in colInstalledPrinters
If PrintLocation = objPrinter.Location Then
WScript.Quit
End If
Next

'Подключаем принтер и делаем его принтером по умолчанию
WSHNetwork.AddWindowsPrinterConnection sPrintPath
WSHNetwork.SetDefaultPrinter sPrintPath


Сохраняем наши скрипт с расширением *.vbs. Подробнее о его работе можно почитать в статье.
В-четвертых, осталось самое простое - все это дело собрать вместе и автоматизировать. Для этого я написал батник простого содержания

start /wait delete_old_printer.vbs
start connect_near_printer.vbs

Теперь батник я помещаю в групповую политику на пользователя (в статье даже с картинками это описано), а рядом с батником помещаю 2 vbs файла.
Дальше тесты. У меня все заработало без проблем. :)

Vladislav_Kolomeytsev@fb
14-10-2013, 16:38
Set objComputer = GetObject _
("LDAP://CN=comp1, OU=ABC, DC=domain, DC=ru")
objComputer.Put "Location" , "Building 37, Floor 2, Room 2133"
objComputer.SetInfo »

У меня есть excel-файл, где прописано имена компьютеров и их местонахождения.
Как можно массово выполнить операцию по изменению данных в AD?




© OSzone.net 2001-2012