#powershell #if-statement #logical-operators
#powershell #if-statement (оператор if) #логические операторы
Вопрос:
У меня проблемы с пониманием значений переменных в PowerShell, и я проверяю их с помощью инструкций if.
$LDAPDirectoryService = '10.10.XXX.XXX:389'
$DomainDN = 'o=Enterprise'
#$LDAPFilter = '(amp;(objectCategory=Person)(memberOf=cn=alc-01-Planung-rw,ou=KT,o=enterprise))'
$LDAPFilter = '(amp;(cn=alc-01-Planung-rw))'
$null = [System.Reflection.Assembly]::LoadWithPartialName('System.Net')
$LDAPServer = New-Object System.DirectoryServices.Protocols.LdapConnection $LDAPDirectoryService
$LDAPServer.AuthType = [System.DirectoryServices.Protocols.AuthType]::Anonymous
$Scope = [System.DirectoryServices.Protocols.SearchScope]::Subtree
$AttributeList = @('*')
$SearchRequest = New-Object System.DirectoryServices.Protocols.SearchRequest -ArgumentList $DomainDN,$LDAPFilter,$Scope,$AttributeList
$groups = $LDAPServer.SendRequest($SearchRequest)
$groups
if ($groups -eq $null) {"No Group found"}
if ($groups -eq " ") {"No Group found"}
foreach ($group in $groups.Entries) {
$users = $group.attributes['member'].GetValues('string')
foreach ($user in $users) {
Write-Host $user
}
}
Я хочу проверить, существует ли группа, а затем, существуют ли пользователи в этой группе. Я перепробовал много инструкций, но, похоже, ни одна из них не работает.
Это не null или пустое значение, даже если в консоли ничего не записано.
Это то, что я получаю, когда использую group, которая не существует:
Кто-нибудь может показать мне решение?
Комментарии:
1. Попробуйте
if ($groups.matcheddn -eq $null) { 'no group found' }
2. К сожалению, это остается тем же самым
3. Я думаю, что
$groups
это массив, поэтому вы могли бы протестироватьCount
свойство с помощьюif ($groups.Count -eq 0)
orif (!($groups.Count))
. Не могу проверить это сам прямо сейчас..4. Это не массив «$ Groups. Записи «остается 1 при любых обстоятельствах
5. что вы получаете в ответ, когда группа ДЕЙСТВИТЕЛЬНО существует?
Ответ №1:
Какую версию PowerShell вы используете? Почему вы не используете встроенные командлеты группы AD для этого или используете не ADD, а какую-то другую службу LDAP?
Или, возможно, вы работаете на OSX / Linux и используете PSCore, для которого командлеты ADDS / RSAT отсутствуют, ну, пока нет?
Для ваших целей …
Я хочу проверить, существует ли группа, а затем, существуют ли пользователи в этой группе.
… В Windows, с PowerShell 3x или выше, это действительно только это…
# Get all AD groups and all members of each group
Clear-Host
(Get-ADGroup -Filter '*').Name |
%{
"`n*** The members of $PSItem are as follows: ***`n"
If((Get-ADGroupMember -Identity $PSItem).Count -ge 1)
{
(Get-ADGroupMember -Identity $PSItem).SamAccountName
}
Else
{
Write-Warning -Message "$PSItem does not exist or has no members."
}
}
# Filtered
Clear-Host
((Get-ADGroup -Filter '*').Name -match 'Domain Admins|Domain Users' ) |
%{
"`n*** The members of $PSItem are as follows: ***`n"
If((Get-ADGroupMember -Identity $PSItem).Count -ge 1)
{
(Get-ADGroupMember -Identity $PSItem).SamAccountName
}
Else
{
Write-Warning -Message "$PSItem does not exist or has no members."
}
}
Однако использую ваш подход LDAP… Как насчет этого…
'Administrators','Distributed COM Users' |
ForEach {
# Define LDAP search root, the Global catalog of the domain
$sLDAPSearchRoot = "LDAP://$((Get-ADDomainController).IPv4Address):389"
# The Groupname to looking for
($sGroupName = "$_")
# The LDAP query - query string
$sSearchStr = "(amp;(objectCategory=group)(name=" $sGroupName "))"
# Get the search object
$oSearch = New-Object directoryservices.DirectorySearcher($oADRoot,$sSearchStr)
# Looking for the group
$oFindResult = $oSearch.FindAll()
# On success, get a DirectoryEntry object for the group
$oGroup = New-Object System.DirectoryServices.DirectoryEntry($oFindResult.Path)
# And list all members
If (($oGroup.Member).Count -ge 1)
{
$oGroup.Member |
%{($oMembers = New-Object System.DirectoryServices.DirectoryEntry($sLDAPSearchRoot "/" $_))}
}
Else
{ Write-Warning -Message "$($oGroup.Member) does not exist or has no members"}
}