Показать полную графическую версию : [решено] Присвоить каждому компьютеру инвентарный номер на основе сайта и порядка
Есть множество сайтов: MSK, SPB, NSK (около 20)
На каждом сайте есть около сотни компьютеров в AD
Необходимо каждому компьютеру присвоить инвентарный номер формата: (001,002,003...), при этом на каждом сайте номера начинаются заново с 001
У каждого компьютера есть свойство в AD - @{extensionAttribute1 = MSK}(или spb или nsk) а @{extensionAttribute2 = 001}
Нужно, чтобы скрипт каждому компьютеру выдал порядковый номер на основании атрибута1 и самое сложное: если компьютер в атрибуте2 уже содержит порядковый номер то он не выдавал этот номер другому компьютеру
Например:
Имя Атрибут1 Атрибут2
Comp1, MSK, ea2=004
Comp2, MSK, ea2=<пусто>
Comp3, MSK, ea2=001
Comp4, MSK, ea2=<Непонятная строка>
Comp5, SPB, ea2=<пусто>
Comp6, SPB, ea2=001
...
После прохождения скрипта:
Имя Атрибут1 Атрибут2
Comp1, MSK, ea2=004
Comp2, MSK, ea2=002
Comp3, MSK, ea2=001
Comp4, MSK, ea2=003
Comp5, SPB, ea2=002
Comp6, SPB, ea2=001
Get-ADComputer -Filter "extensionAttribute1 -like '*'" -Properties extensionAttribute1,extensionAttribute2 | Group-Object extensionAttribute1 | Foreach {
$ex2 = $_.Group | Where {$_.extensionAttribute2 -match "^\d{3}$"} | Foreach-Object {$_.extensionAttribute2}
$start = 0
$id = "$start".PadLeft(3,'0')
$_.Group | Where {$_.extensionAttribute2 -notmatch "^\d{3}$"} | Foreach-Object {
do {
$start++
$id = "$start".PadLeft(3,'0')
} while($ex2 -contains $id)
Set-ADComputer $_ -Replace @{extensionAttribute2=$id}
}
}
Сижу уже минут пять туплю в код, словно повершел впервой вижу
а что значит эта строка:
$ex2 = $_.Group | Where {$_.extensionAttribute2 -match "^\d{3}$"} | Foreach-Object {$_.extensionAttribute2}
Как оно потом заходит в while не могу понять
$ex2 = $_.Group | Where {$_.extensionAttribute2 -match "^\d{3}$"} | Foreach-Object {$_.extensionAttribute2}
Where {$_.extensionAttribute2 -match "^\d{3}$"} - Только строки удовлетворяющие шаблону 000..999
Foreach-Object {$_.extensionAttribute2} - получить значение атрибута extensionAttribute2
$ex2 - содержит все текущие используемые значения extensionAttribute2 из сайта, в while идет проверка, есть значение в $ex2,уже используется, добавить единичку
Оставил в выборке 7 тестовых компьютеров,
в результате скрипт перезаписывает атрибуты поверх уже имеющихся, нужно чтобы он не менял те что есть
Первый атрибут везде SPB
было
name attrib2
SPB-COMP-003 <не задано>
SPB-COMP-004 <не задано>
SPB-COMP-005 <не задано>
SPB-COMP-006 005
SPB-COMP-007 001
SPB-COMP-008 <не задано>
SPB-COMP-010 <не задано>
Первый запуск:
SPB-COMP-003 002
SPB-COMP-004 003
SPB-COMP-005 004
SPB-COMP-006 006
SPB-COMP-007 007
SPB-COMP-008 008
SPB-COMP-010 009
На второе выполнение:
SPB-COMP-003 001
SPB-COMP-004 005
SPB-COMP-005 010
SPB-COMP-006 011
SPB-COMP-007 012
SPB-COMP-008 013
SPB-COMP-010 014
Третье
SPB-COMP-003 002
SPB-COMP-004 003
SPB-COMP-005 004
SPB-COMP-006 006
SPB-COMP-007 007
SPB-COMP-008 008
SPB-COMP-010 009
$_.Group | Foreach-Object заменить строку на :
$_.Group | Where {$_.extensionAttribute2 -notmatch "^\d{3}$"} | Foreach-Object
Kazun, нумерация будет дублироваться
Спасибо, работает, это круто...
Kazun, Можешь помочь адаптировать этот скрипт чтобы он выполняясь на локальной машине выдавал свободный инвентарный номер основываясь на Атрибуте1(берется из переменной(ее получает другой скрипт)) и основываясь на уже имеющихся Атрибуте2 в AD
Например уже есть в AD компьютеры:
Имя Атрибут2 Атрибут1
SPB-COMP-003 002 SPB
SPB-COMP-004 003 SPB
SPB-COMP-005 SPB
MSK-COMP-006 MSK
SPB-COMP-007 007 SPB
SPB-COMP-008 SPB
SPB-COMP-010 009 SPB
Когда я выполняю скрипт на компьютере SPB-COMP-005, то скрипт возвращает значение 001
Когда я выполняю скрипт на компьютере MSK-COMP-006, то скрипт возвращает значение 001
Когда я выполняю скрипт на компьютере SPB-COMP-008, то скрипт возвращает значение 004
Это нужно для автоматизации получения имени компьютера перед вводом в домен
Заранее создать учетную запись компьютера с уже заданными Атрибут1 и Атрибут2, а не городить подобные решения.
Kazun, Так мы же про автоматизацию, имена компьютеров сложные и содержат инфу из компьютера, там серийники, типы итп, чтобы ручками ничего не нужно было делать, помоги пожалуйста...
Т.к. локальный комптьютер не в домене, то требуется указать $DomainDN,$Site для которого осуществляется поиск и учетную запись,которая имееет доступ к Active Directory.
# Атрибуте1(берется из переменной(ее получает другой скрипт))
$site = "...."
#Учетные данные для подключения к Active Directory
$Credential = New-Object System.Management.Automation.PSCredential('UserName', (ConvertTo-SecureString 'Password' -Force -AsPlainText))
# Создаем ADSI Search
$Searcher = New-Object System.DirectoryServices.DirectorySearcher
$Searcher.PropertiesToLoad.Add('extensionAttribute2')
# Только данные из текущего сайта
$Searcher.Filter = "(extensionAttribute1=$site)"
# Домен для подключения
$DomainDN = "LDAP://corp.contoso.com/DC=corp,DC=contoso,DC=ru"
# Подключение
$Domain = New-Object System.DirectoryServices.DirectoryEntry($DomainDN ,$Credential.UserName,$Credential.GetNetworkCredential().Password)
# Устанавливаем текущие данные подключения
$Searcher.SearchRoot = $Domain
# Делаем поиск
$All = $Searcher.FindAll()
$ex2 = $All | Where {$_.Properties["extensionAttribute2"][0] -match "^\d{3}$"} | Foreach {$_.Properties["extensionAttribute2"][0]}
# Получаем свободный ID
$Start = 0
do {
$Start++
$FreeId = "$Start".PadLeft(3,'0')
} while($ex2 -contains $FreeId)
$FreeID
Вываливает такое:
строка:12 знак:67
+ $Searcher = New-Object System.DirectoryServices.DirectorySearcher()
+ ~
После ''('' ожидалось выражение.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ExpectedExpression
Так ведь будет работать?:
$site = "SPB"
$server = "dc1"
а учетные данные подтягиваются из unattened файла
$All = Get-ADComputer -Filter * -Properties extensionAttribute1,extensionAttribute2 -server $server | where {$_.extensionAttribute1 -eq $site}
# Делаем поиск
#$All = $Searcher.FindAll()
$ex2 = $All | Where {$_.extensionAttribute2 -match "^\d{3}$"} | Foreach {$_.extensionAttribute2}
# Получаем свободный ID
$Start = 0
do {
$Start++
$FreeId = "$Start".PadLeft(3,'0')
} while($ex2 -contains $FreeId)
$FreeID
Разобрался со всем, осталось только строку:
Set-ADComputer $env:computername -Replace @{extensionAttribute2=$id}
Перевести в ADSI запрос
(это нужно чтобы при создании компьютера в AD скрипт сразу добавлял себе в св-ва информацию о себе)
Help?)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.