Benutzer mit den meisten Antworten
foreach Get-ADUser

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.
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''
- Bearbeitet BOfH-666 Freitag, 22. Februar 2019 08:06
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Montag, 25. Februar 2019 16:16
- Als Antwort markiert Denniver ReiningMVP, Moderator Samstag, 2. März 2019 12:16
-
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- Bearbeitet brima Freitag, 22. Februar 2019 15:51
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Montag, 25. Februar 2019 16:15
- Als Antwort markiert Denniver ReiningMVP, Moderator Samstag, 2. März 2019 12:15
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''
- Bearbeitet BOfH-666 Freitag, 22. Februar 2019 08:06
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Montag, 25. Februar 2019 16:16
- Als Antwort markiert Denniver ReiningMVP, Moderator Samstag, 2. März 2019 12:16
-
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- Bearbeitet brima Freitag, 22. Februar 2019 15:51
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Montag, 25. Februar 2019 16:15
- Als Antwort markiert Denniver ReiningMVP, Moderator Samstag, 2. März 2019 12:15