У меня есть следующий сценарий:
#Script uses quest powershell commandlets which can be downloaded for free from quest website
# http://www.quest.com/powershell/activeroles-server.aspx
#Specify the OU you want to search for inactive accounts
$SearchOU=“OU=Sites,DC=nl,DC=example,DC=com"
#Specify the OU you want to move your inactive computer accounts to
#$DestinationOU=“CN=Computers,DC=**,DC=example,DC=com"
#Specify the number of days that computers have been inactive for
$NumOfDaysInactiveFor = 100
#Specify the description to set on the computer account
$Today = Get-Date
$Description = "Account disabled due to inactivity on $Today"
Get-QADComputer -InactiveFor $NumOfDaysInactiveFor -SizeLimit 0 -SearchRoot $searchOU -IncludedProperties ParentContainerDN | foreach {
$computer = $_.ComputerName
$SourceOU = $_.DN
#Remove the commented # from the next line if you want to set the description to be the source OU
#$Description = "SourceOU was $SourceOu"
Set-QADComputer $computer -Description $Description
Disable-QADComputer $computer
#Move-QADObject $computer -NewParentContainer $destinationOU
}
Я хочу исключить одно или несколько подразделений, находящихся в SearchOU, возможно ли это? Я понятия не имею, как я могу с этим справиться.
Я использую следующий SearchOU = OU = Sites, DC = nl, DC = example, DC = com
. Я хочу исключить следующие подразделения, например = OU = Warehouses, OU = *, OU = Sites, DC = *, DC = example, DC = com
С помощью параметра -LdapFilter
вы можете установить фильтр поиска LDAP с учетом регистра. Но фильтрация AFAIK для DN с, например, (! Ou = WareHouses)
не поддерживается ...
Типичным подходом был бы вложенный цикл, который сначала с областью поиска одного уровня перечисляет подразделений, а затем выполняет предполагаемый поиск во всех подразделениях, имена которых не соответствуют *, ou = WareHouses, *
в псевдокоде:
for COUNTRY in DC=*.DC=example,DC=com
do
for OrgUnit in OU=*,DC=$COUNTRY,DC=example,DC=com
do
if ( $OrgUnit != *WareHouses* ) {
Get-QADComputer -SearchRoot $OrgUnit ....
}
done
done
Это более подробный ответ на HBruijn. Я добавил строку в код ниже, отфильтровав указанные вами подразделения "Склады". Это можно отредактировать, чтобы иметь несколько OU или настроить выражение регулярного выражения в соответствии с вашими потребностями. У тебя так много способов сделать это.
#Specify the OU you want to search for inactive accounts
$SearchOU=“OU=Sites,DC=nl,DC=example,DC=com"
#Specify the OU you want to move your inactive computer accounts to
#$DestinationOU=“CN=Computers,DC=**,DC=example,DC=com"
#Specify the number of days that computers have been inactive for
$NumOfDaysInactiveFor = 100
#Specify the description to set on the computer account
$Today = Get-Date
$Description = "Account disabled due to inactivity on $Today"
Get-QADComputer -InactiveFor $NumOfDaysInactiveFor -SizeLimit 0 -SearchRoot $searchOU -IncludedProperties ParentContainerDN | foreach {
#Filter out OUs we don't care about
if ( $_.DN -notmatch 'OU=Warehouses,OU=.*,OU=Sites,DC=.*,DC=example,DC=com') {
$computer = $_.ComputerName
$SourceOU = $_.DN
#Remove the commented # from the next line if you want to set the description to be the source OU
#$Description = "SourceOU was $SourceOu"
Set-QADComputer $computer -Description $Description
Disable-QADComputer $computer
#Move-QADObject $computer -NewParentContainer $destinationOU
}
}
Командлеты Quest AD были полезны... Однажды.
Но теперь вы можете просто импортировать модуль ActiveDirectory
.
Затем получите список пользователей AD (или компьютеров, или чего-то еще) и отфильтруйте пользователей, содержащихся в определенном подразделении:
$searchou = 'OU=MyOU,DC=domain,DC=com'
$excludeou = "ouname'
Get-ADUser -filter * -SearchBase $searchou | where { $_.DistinguishedName
-notlike $ouname }