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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Windows NT/2000/2003 (http://forum.oszone.net/forumdisplay.php?f=5)
-   -   Скрипт для изменения свойств компьютера в AD (http://forum.oszone.net/showthread.php?t=94238)

madmax24 16-11-2007 09:50 679699

Скрипт для изменения свойств компьютера в AD
 
Добрый.
Я хочу с помощью скрипта изменять поле 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 679741

ну если контейнер/домен вычислять не надо то можно просто восстановить значение переменной окружения:
Код:

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 679746

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

п.с. Кстати, тут на радостях то своих не узрел, что у тебя в месте
Цитата:

Цитата amel27
CN=" & COMP »

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

madmax24 16-11-2007 12:17 679769

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

HLT 16-11-2007 13:01 679794

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

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

Подробнее об этих командах в первоисточнике:
dsquery
dsmod

madmax24 16-11-2007 15:37 679899

HLT, спасибо, это то что надо. Работает на ура! :)

madmax24 26-11-2007 12:58 685450

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

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

На сайте http://networkdoc.ru существует вот эта статья, примерно описывающая мою задачу. Но в ней есть некоторые моменты, которые у меня не заработали, поэтому пришлось колхозить самому. В итоге я избавился от старого принт-сервера, а новые принтеры сами появляются у пользователя при залогинивании и дефолтным выставляется ближайший. Че еще добавить не знаю, поэтому просто опишу очередность работы скриптов.

Во-первых нам для географического отделения компьютеров потребуется заполнить поле 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 2234303

Цитата:

Цитата madmax24
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?


Время: 06:56.

Время: 06:56.
© OSzone.net 2001-