Проверка Powershell, если OU существует - PullRequest
8 голосов
/ 26 июля 2011

Я пытаюсь проверить, существует ли OU перед его созданием.Моя проблема в том, что у меня есть 2 материнских подразделения "USER BY SITE" и "GROUP BY SITE", и мне нужно иметь точно такое же подразделение в этих 2, 1 для хранения пользователей, другое для хранения групп.

До сих пор я использовал эту функцию:

function CheckOUExist
{
    param($OUToSeek)

    $LDAPPath = "LDAP://dc=Domain,dc=local"

    $seek = [System.DirectoryServices.DirectorySearcher]$LDAPPath
    $seek.Filter = “(&(name=$OUToSeek)(objectCategory=organizationalunit))”
    $Result = $seek.FindOne()

    return $Result
}

Есть моя проблема, я всегда получаю OU, существующее в "GROUP BY SITE", даже если $ LDAPPath = "OU = USERS BY SITE, DC = Domain,DC = локальный».Я что-то там упускаю?Есть ли способ для [System.DirectoryServices.DirectorySearcher] работать только в OU, который я дал в $ LDAPPath?

Если вам нужны более точные детали, я с удовольствием предоставлю их.

Заранее спасибо.

Ответы [ 5 ]

12 голосов
/ 22 февраля 2012

Следующее, как предлагает Шей, прекрасно работает, если вы работаете с чистыми данными.

[string] $Path = 'OU=test,DC=domain,DC=com'
[adsi]::Exists("LDAP://$Path")

Спасибо за эту отличную отправную точку!Однако, если вы проверяете потенциально нечистые данные, вы получите ошибку.Некоторые примеры возможных ошибок:

  • Если что-то не отформатировано должным образом
    • (ERR: был указан неверный синтаксис dn)
  • Если домен не существует
    • (ОШИБКА: сервер не работает)
  • Если домен не будет с вами связываться
    • (ERR: Реферал был возвращен с сервера)

Все эти ошибки должны быть перехвачены с [System.Management.Automation.RuntimeException], или вы можете просто оставить оператор catch пустым, чтобы перехватall.

Быстрый пример:

[string] $Path = 'OU=test,DC=domain,DC=com'
try {
    $ou_exists = [adsi]::Exists("LDAP://$Path")
} catch {
    # If invalid format, error is thrown.
    Throw("Supplied Path is invalid.`n$_")
}

if (-not $ou_exists) {
    Throw('Supplied Path does not exist.')
} else {
    Write-Debug "Path Exists:  $Path"
}

Подробнее: http://go.vertigion.com/PowerShell-CheckingOUExists

11 голосов
/ 27 июля 2011

Попробуйте метод Exists, вы получите соответственно true / false:

[adsi]::Exists("LDAP://OU=test,DC=domain,DC=com")
2 голосов
/ 27 июля 2011

Проблема заключается в создании объекта DirectorySearcher.Чтобы правильно установить корневой каталог поиска, необходимо создать DirectorySearcher с использованием объекта DirectoryEntry (ускоритель типа [ADSI]), в то время как вы используете строку.Когда используется строка, она используется в качестве фильтра LDAP, а корень поиска имеет значение null, в результате чего искатель использует корень текущего домена.Вот почему, похоже, он не ищет нужную вам OU.

Я думаю, вы получите результаты, которые ищете, если сделаете что-то вроде следующего:

$searchroot = [adsi]"LDAP://OU=USERS BY SITE,DC=Domain,DC=local"

$seek = New-Object System.DirectoryServices.DirectorySearcher($searchroot)
$seek.Filter = "(&(name=$OUToSeek)(objectCategory=organizationalunit))"
... etc ...

Обратите внимание, что сначала создается DirectoryEntry, который затем используется для создания DirectorySearcher.

1 голос
/ 11 февраля 2016

Как насчет:

#Requires -Version 3.0

# Ensure the 'AD:' PSDrive is loaded.
if (-not (Get-PSDrive -Name 'AD' -ErrorAction Ignore)) {
    Import-Module ActiveDirectory -ErrorAction Stop
    if (-not (Get-PSDrive -Name 'AD' -ErrorAction Silent)) {
        Throw [System.Management.Automation.DriveNotFoundException] "$($Error[0]) You're likely using an older version of Windows ($([System.Environment]::OSVersion.Version)) where the 'AD:' PSDrive isn't supported."
    }
}

Теперь, когда AD: PSDrive загружен, у нас есть несколько вариантов:

$ou = "OU=Test,DC=Contoso,DC=com"
$adpath = "AD:\$ou"

# Check if this OU Exist
Test-Path $adpath

# Throw Error if OU doesn't exist
Join-Path 'AD:' $ou -Resolve

Больше информации по этой теме: Игра с AD: Drive для удовольствия и прибыли

0 голосов
/ 16 октября 2013
Import-Module ActiveDirectory
Function CheckIfGroupExists{
    Param($Group)
    try{
        Get-ADGroup $Group
    }
    catch{
        New-ADGroup $Group -GroupScope Universal
    }
}

Также будет работать

...