pixel0815
Goto Top

Protokollierung für folgendes Skript in Powershell

Moin zusammen,

kann mir jemand sagen wie ich hier eine CSV Datei erstellen kann mit dem Skript?
Ich würde gerne über die Aktionen ein Protokoll haben der mir sagt welcher Benutzer aus der Gruppe entfernt wurde und welcher Hinzugekommen ist, mit Datum und Zeit natürlich.
Leider bin ich mehr der Typ der keine Ausgaben macht, aber das macht durchaus Sinn hier.
Hat jemand ne Idee?

Import-Module ActiveDirectory
$groupname = "test123"  
$OU = "*************"  
$users = get-aduser -Filter { postalCode -like "*******" } -SearchBase $OU -Properties PostalCode -ResultSetSize $null  
foreach($user in $users)
{
  Add-ADGroupMember -Identity $groupname -Member $user.samaccountname -ErrorAction SilentlyContinue
  }
$members = Get-ADGroupMember -Identity $groupname
foreach($member in $members)
{
  if($member.distinguishedname -notlike "***************")  
  {
    Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
  }
}

Vielen Dank :o)

Content-Key: 251753

Url: https://administrator.de/contentid/251753

Printed on: April 19, 2024 at 22:04 o'clock

Member: colinardo
colinardo Oct 13, 2014 updated at 08:47:24 (UTC)
Goto Top
Moin Heiko,
guckst du hier ...
Import-Module ActiveDirectory
$result = @()
$csv = 'C:\ergebnis.csv'  
$groupname = "test123"  
$OU = "*************"  
$users = get-aduser -Filter { postalCode -like "*******" } -SearchBase $OU -Properties PostalCode -ResultSetSize $null  
foreach($user in $users)
{
  Add-ADGroupMember -Identity $groupname -Member $user.samaccountname -ErrorAction SilentlyContinue
  $result += new-object PSObject -Property @{'Username'=$user.samaccountname;'Group'=$groupname;'Action'='Hinzugefügt';'Date'=get-date}  
}
$members = Get-ADGroupMember -Identity $groupname
foreach($member in $members)
{
  if($member.distinguishedname -notlike "***************")  
  {
    Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
    $result += new-object PSObject -Property @{'Username'=$member.samaccountname;'Group'=$groupname;'Action'='Entfernt';'Date'=get-date}  
  }
}
$result | export-csv $csv -Delimiter ";" -NoTypeInformation -Encoding UTF8  
mit
$result = @()
erzeugst du zuerst ein leeres Array. Diesem Array fügt man dann im jeweiligen Abschnitt ein PSObject mit den gewünschten Spaltennamen(Eigenschaften) und den Werten hinzu.
$result += new-object PSObject -Property @{'Username'=$user.samaccountname;'Group'=$groupname;'Action'='Hinzugefügt';'Date'=get-date}
Solch ein Array lässt sich dann direkt an export-csv für den Export in eine CSV-Datei übergeben.

Grüße Uwe
Member: pixel0815
pixel0815 Oct 13, 2014 at 09:03:52 (UTC)
Goto Top
Das ist ja klasse.
Sag mal kann man das so in der Art machen das er vorher prüft ob der Benutzer schon drinne ist (Zeile 6 )
Irgendwie bekomme ich das nicht hin.
Member: colinardo
colinardo Oct 13, 2014 updated at 09:15:50 (UTC)
Goto Top
Zitat von @pixel0815:
Sag mal kann man das so in der Art machen das er vorher prüft ob der Benutzer schon drinne ist (Zeile 6 )
wo drinne ? in der CSV oder in der Gruppe ?
Um zu testen ob der User in der Gruppe bereits Mitglied ist kannst du es so machen:
$test = Get-AdGroupMember $groupname | ?{$_.SamAccountName -eq $user.SamAccountname}
if (!$test){
  # User ist noch kein Mitglied, füge User zur Gruppe hinzu 
  # Add-ADGroupMember ......................
}
Member: pixel0815
pixel0815 Oct 13, 2014 at 09:29:43 (UTC)
Goto Top
Ich wollte das eigentlich direkt in der Zeile der Userermittlung machen mit nem Pipe oder so
Member: colinardo
colinardo Oct 13, 2014 updated at 09:35:40 (UTC)
Goto Top
Zitat von @pixel0815:

Ich wollte das eigentlich direkt in der Zeile der Userermittlung machen mit nem Pipe oder so
OK, das geht auch:
$groupmembers = Get-AdGroupMember $groupname
$users = get-aduser -Filter { postalCode -like "*******" } -SearchBase $OU -Properties PostalCode -ResultSetSize $null | ?{$_.SamAccountName -notin $groupmembers.SamAccountName}  
ist Performancetechnisch besser das in zwei Zeilen aufzuteilen, sonst muss das Script jedes mal die Gruppenmember enumerieren...
Member: pixel0815
pixel0815 Oct 13, 2014 at 09:54:53 (UTC)
Goto Top
Merkwürdig.
Wenn ich jetzt den Filter direkt in der PS so setze

get-aduser -Filter { postalCode -like "*22869*" } -SearchBase $OU -Properties PostalCode,SamAccountName -ResultSetSize $null | ?{$_.SamAccountName -notin $groupmembers.SamAccountName}  

erhalte ich auf dem DC ein Ergebnis.

Das Skript läuft aber mit einem Fehler.

Sie müssen auf der rechten Seite des Operators "-" einen Wertausdruck angeben.  
Bei C:\Users\*****\Documents\DynmischeGruppe.ps1:18 Zeichen:158
+ $users = get-aduser -Filter { postalCode -like "*22869*" } -SearchBase $OU -Properties PostalCode,SamAccountName -ResultSetSize $null | ?{$_.SamAccountName - <<<< notin $groupmembers.SamAccountName}  
    + CategoryInfo          : ParserError: (:) , ParseException
    + FullyQualifiedErrorId : ExpectedValueExpression
Member: colinardo
Solution colinardo Oct 13, 2014 updated at 10:31:48 (UTC)
Goto Top
Du hast die erste Zeile nicht mit übernommen:
$groupmembers = Get-AdGroupMember $groupname 
oder du verwendest eine veraltete Powershell die den Operator -notin noch nicht kennt (ab PS 3.0).

Lässt sich aber Alternativ auch mit dem Filter machen:
http://stackoverflow.com/questions/15353414/powershell-and-activedirect ...
Member: pixel0815
pixel0815 Oct 13, 2014 at 10:15:10 (UTC)
Goto Top
Ops- peinlich! ... Ich sag mal nix mehr face-smile
Habe noch die Version 2.0 auf meiner Maschine und auf dem PC wo ich ab und zu teste die 3.0