web-dev-qa-db-ja.com

OUが存在するかどうかを確認するPowershell

OUを作成する前に、OUが存在するかどうかを確認しようとしています。私の問題は、2つのマザーOU「USERBYSITE」と「GROUPBYSITE」があり、ユーザーを格納するためとグループを格納するための2つにまったく同じOUが必要なことです。

これまで私はこの関数を使用しました:

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
}

私の問題があります。$ LDAPPath = "OU = USERS BY SITE、DC = Domain、DC = local"であっても、常に "GROUP BYSITE"にOUが存在します。私はそこに何かが欠けていますか? [System.DirectoryServices.DirectorySearcher]を$ LDAPPathで指定したOUでのみ機能させる方法はありますか?

より正確な詳細が必要な場合は、喜んで提供します。

前もって感謝します。

9

Existsメソッドを試してください。それぞれtrue/falseが返されます。

[adsi]::Exists("LDAP://OU=test,DC=domain,DC=com")
12
Shay Levy

Shayが提案しているように、クリーンなデータを使用している場合は、次のように機能します。

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

この素晴らしい出発点をありがとう!ただし、クリーンでない可能性のあるデータを検証している場合は、エラーがスローされます。考えられるエラーの例は次のとおりです。

  • 何かが適切にフォーマットされていない場合
    • (ERR:無効なdn構文が指定されました)
  • ドメインが存在しない場合
    • (ERR:サーバーは動作していません)
  • ドメインがあなたと通信しない場合
    • (ERR:サーバーから紹介が返されました)

これらのエラーはすべて[System.Management.Automation.RuntimeException]でキャッチする必要があります。または、catchステートメントを空白のままにしてすべてをキャッチすることもできます。

簡単な例:

[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

14
VertigoRay

問題は、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の作成に使用されることに注意してください。

2
Artomegus

どうですか:

#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で遊ぶ:楽しみと利益のためのドライブ

1
TheQrtKenny