none
foreach Get-ADUser RRS feed

  • Frage

  • Hallo an alle,

    ich versuche mich gerade in Powershell und habe diesbezüglich ein Array gebaut mit 3 Namen aus dem AD. Dieses Array soll durchsucht werden und wenn der Name aus dem Array mit dem SamAccountName übereinstimmt sollen diverse Werte ausgegeben werden.

      $account = @("user1","1007sfd","user3")  
    
    
    for ($i=0; $i -lt $account.length; $i++){
         Try {
              Write-Host $account[$i]
              $Info = Get-ADUser -Filter "SamAccountName -like '$account[$i]'" -Properties Mail,Description,Telephonenumber
              $Info.Mail
              $Info.GivenName
              $Info.Surname
              $Fullname = $Info.Surname+", "+$Info.GivenName
              $Info.Telephonenumber
              Write-Host "testende"
                }
         Catch {
              Write-host  $account[$i]"Account nicht vorhanden"
                }
         Finally {
              #Write-host "fertig"
                }
    
    }
    

    Wenn ich $account[$i] gegen den eigentlichen Namen (zb. User1) tausche funktioniert es. Warum nicht mit $account[$i]? Es steht das gleiche drin aber es scheint nicht der gleiche Datentyp zu sein oder nicht vergleichbar???

    Danke schon mal für eure Hilfe.

    Freitag, 22. Februar 2019 06:52

Antworten

  • Ich habe Deinen Code mal ein bissl "aufgeräumt" ....

    $accountList = @(
        'user1',
        '1007sfd',
        'user3'
    )
    
    foreach ($account in $accountList) {
        $User = Get-ADUser -Filter "SamAccountName -like '$account*'" -Properties Mail, Description, Telephonenumber 
        [PSCustomObject]@{
            Mail      = $User.Mail
            GivenName = $User.GivenName
            Surname   = $User.SurName
            FullName  = ($User.Surname , $User.GivenName) -join ', '
        }
    }

    Die andere Schreibweise des Arrays ist nur Kosmetik - macht aber das Gleiche wie Dein Code.

    Wenn Du über die Elemente eines Array "drüber-iterieren" willst, kannst Du Dir das Leben mit einer Foreach-Schleife einfacher machen.

    Wenn Du in Deiner AD-Query den Vergleichs-Operator -Like benutzt, mußt Du ihm einen String "anfüttern", der auch ein Wild-Card-Zeichen enthält (*). Eine andere Möglichkeit wäre -match zu benutzen.

    Das PSCustomObject ist vielleicht in diesem Fall ein bissl "überdimensioniert", aber ich find's immer viel übersichtlicher als z.B. eine Select-Object mit calculated Properties aufzupeppen.

    Dein try-catch-finaly kann so nicht funktionieren. Dafür bräuchtest Du einen "terminating Error" im try-Block. Wenn das cmdlet, welches Du benutzt, nicht per default einen terminating error auslöst, musst Du ihm das Verhalten quasi aufzwingen ... mittels einem -ErrorAction Stop. Sonst würde Dein catch-Block niemals ausgelöst.

    Gut so?  ;-)  :-D

    Edit: Was mir noch eingefallen ist - wenn Du als Suchkriterium den sAMAccountName benutzt, kannst Du Deine AD-Query auch mit dem Paramter -Identity durchführen ...

    Get-ADUser -Identity $account
    ... und wenn Du mit dem Parameter -Filter das AD "durchackerst", solltest Du eine -SearchBase angeben. Das erzeugt weniger Last auf Deinem AD-Controller und beschleunigt die meisten Queries deutlich.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''





    Freitag, 22. Februar 2019 07:42
  • Hi,

    ersetze mal den Teil

    "SamAccountName -like '$account[$i]'"

    durch

    "SamAccountName -eq '$($account[$i])'"
    # oder
    "SamAccountName -like '$($account[$i])*'"

    dann sollte dein Code auch funktionieren, wobei die Lösung von Olaf zu bevorzugen ist.

    Beste Gruesse
    brima


    Freitag, 22. Februar 2019 15:43

Alle Antworten

  • Ich habe Deinen Code mal ein bissl "aufgeräumt" ....

    $accountList = @(
        'user1',
        '1007sfd',
        'user3'
    )
    
    foreach ($account in $accountList) {
        $User = Get-ADUser -Filter "SamAccountName -like '$account*'" -Properties Mail, Description, Telephonenumber 
        [PSCustomObject]@{
            Mail      = $User.Mail
            GivenName = $User.GivenName
            Surname   = $User.SurName
            FullName  = ($User.Surname , $User.GivenName) -join ', '
        }
    }

    Die andere Schreibweise des Arrays ist nur Kosmetik - macht aber das Gleiche wie Dein Code.

    Wenn Du über die Elemente eines Array "drüber-iterieren" willst, kannst Du Dir das Leben mit einer Foreach-Schleife einfacher machen.

    Wenn Du in Deiner AD-Query den Vergleichs-Operator -Like benutzt, mußt Du ihm einen String "anfüttern", der auch ein Wild-Card-Zeichen enthält (*). Eine andere Möglichkeit wäre -match zu benutzen.

    Das PSCustomObject ist vielleicht in diesem Fall ein bissl "überdimensioniert", aber ich find's immer viel übersichtlicher als z.B. eine Select-Object mit calculated Properties aufzupeppen.

    Dein try-catch-finaly kann so nicht funktionieren. Dafür bräuchtest Du einen "terminating Error" im try-Block. Wenn das cmdlet, welches Du benutzt, nicht per default einen terminating error auslöst, musst Du ihm das Verhalten quasi aufzwingen ... mittels einem -ErrorAction Stop. Sonst würde Dein catch-Block niemals ausgelöst.

    Gut so?  ;-)  :-D

    Edit: Was mir noch eingefallen ist - wenn Du als Suchkriterium den sAMAccountName benutzt, kannst Du Deine AD-Query auch mit dem Paramter -Identity durchführen ...

    Get-ADUser -Identity $account
    ... und wenn Du mit dem Parameter -Filter das AD "durchackerst", solltest Du eine -SearchBase angeben. Das erzeugt weniger Last auf Deinem AD-Controller und beschleunigt die meisten Queries deutlich.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''





    Freitag, 22. Februar 2019 07:42
  • Hi,

    ersetze mal den Teil

    "SamAccountName -like '$account[$i]'"

    durch

    "SamAccountName -eq '$($account[$i])'"
    # oder
    "SamAccountName -like '$($account[$i])*'"

    dann sollte dein Code auch funktionieren, wobei die Lösung von Olaf zu bevorzugen ist.

    Beste Gruesse
    brima


    Freitag, 22. Februar 2019 15:43