Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Bei Event funktioniert das Powershell Script nicht richtig

Frage Microsoft Windows Server

Mitglied: canlot

canlot (Level 1) - Jetzt verbinden

13.11.2017 um 09:46 Uhr, 191 Aufrufe, 14 Kommentare, 4 Danke

Hallo liebe Community,

ich habe hier ein Powershell Script geschrieben, dass bei der Erstellung eines User in einer OU automatisch eine Gruppe mit dem Namen der OU erstellt und ihn dann der Gruppe hinzufügt.
Dann noch ein Script, wenn ein User in eine andere OU verschoben wird, dass er dann aus der alten Gruppe gelöscht wird und einer neuen hinzugefügt wird.
Das erste Script funktioniert, das zweite ab und zu mal, ich konnte noch nicht wirklich feststellen warum es manchmal funktioniert und manchmal nicht.

Manuel ausführen funktioniert immer, das Ausführen nach einem Event dagegen sporadisch.
Ausgeführt wird das auf einem DC.

Hier ist der Code, wenn der Benutzer verschoben wurde.
01.
function GetCityName($City) 
02.
03.
    switch($City) 
04.
05.
        "Berlin" {return "BER"} 
06.
        "München" {return "MUN"} 
07.
        "London" {return "LON"} 
08.
        "Madrid" {return "MAD"} 
09.
        "Paris" {return "PAR"} 
10.
        "Warschau" {return "WAR"} 
11.
        default { return $false} 
12.
 
13.
 
14.
15.
16.
 
17.
function GetGroupName($OuName) 
18.
19.
    $groupName = "" 
20.
 
21.
    $OuArray = $OuName.Split(",") 
22.
 
23.
    $City = GetCityName($OuArray[-6].Split("=")[1]) 
24.
    if($City -eq $false) 
25.
26.
        return $false 
27.
28.
     
29.
    $specialGroup = "" 
30.
    $department = "" 
31.
    if($OuArray[-7].Split("=")[1] -eq "Special Groups") 
32.
33.
        $specialGroup = "SP" 
34.
        $groupName = "GRP_" + $City + "_" + $specialGroup 
35.
        for($counter = $OuArray.Count - 8; $counter -ge 0; $counter--) 
36.
37.
            $item = $OuArray[$counter].Split("=")[1] 
38.
            $groupName = $groupName + "_" + $item 
39.
40.
41.
    else 
42.
43.
        #$department = $OuArray[-7].Split("=")[1] 
44.
        $groupName = "GRP_" + $City 
45.
        for($counter = $OuArray.Count - 7; $counter -ge 0; $counter--) 
46.
47.
            $item = $OuArray[$counter].Split("=")[1] 
48.
            $groupName = $groupName + "_" + $item 
49.
50.
51.
     
52.
    return $groupName 
53.
     
54.
55.
 
56.
 
57.
 
58.
$BaseOu = "OU=Firma,DC=intern,DC=firma,DC=de" 
59.
$message = Get-EventLog -LogName security -InstanceId 5139 -Newest 1 | select message | Format-List | Out-String #Benutzer erstellt 
60.
#$user = ([regex]::Match($message,'Account Name:(.*)').NextMatch().groups[1].Value).Trim("") 
61.
 
62.
$objectClass = ([regex]::Match($message,'Class:(.*)').Value).Trim("") 
63.
$objectClass = $objectClass.Split(":")[1].Trim(" ") 
64.
 
65.
if($objectClass -ne "user") 
66.
67.
    Exit 
68.
69.
 
70.
 
71.
$OldOu = ([regex]::Match($message,'Old DN:(.*)').Value).Trim("") 
72.
$OldOu = $OldOu.Split(":")[1].Trim(" ") 
73.
$OldOu = $OldOu.Remove(0, $OldOu.IndexOf(',',0)+1) 
74.
$OldOu = $OldOu.Remove(0, $OldOu.IndexOf(',',0)+1) 
75.
 
76.
if($OldOu -eq $null -or $OldOu -eq "") 
77.
78.
    Exit 
79.
80.
 
81.
$NewOu = ([regex]::Match($message,'New DN:(.*)').Value).Trim("") 
82.
$NewOu = $NewOu.Split(":")[1].Trim(" ") 
83.
$NewOu = $NewOu.Remove(0, $NewOu.IndexOf(',',0)+1) 
84.
$NewOu = $NewOu.Remove(0, $NewOu.IndexOf(',',0)+1) 
85.
 
86.
if($NewOu -eq $null -or $NewOu -eq "") 
87.
88.
    Exit 
89.
90.
 
91.
$userGUID = ([regex]::Match($message,'GUID:(.*)').Value).Trim("") 
92.
$userGUID = $userGUID.Split(":")[1].Trim(" ") 
93.
$userGUID = $userGUID.Trim("{") 
94.
$userGUID = $userGUID.Trim("}") 
95.
 
96.
$user = Get-ADUser -Identity $userGUID 
97.
#Write-Host $userGUID 
98.
#Write-Host $user 
99.
#Write-Host $message 
100.
 
101.
 
102.
$OldGroupName = GetGroupName($OldOu) 
103.
$NewGroupName = GetGroupName($NewOu) 
104.
 
105.
if($NewGroupName -eq $false) 
106.
107.
    Exit 
108.
109.
 
110.
if(Get-ADPrincipalGroupMembership $user | select name | where name -eq $OldGroupName) 
111.
112.
    Remove-ADGroupMember -Identity $OldGroupName -Members $user -Confirm: $false 
113.
114.
 
115.
if((Get-ADGroup -SearchBase $BaseOu -Filter * | select name | where name -eq $NewGroupName) -ne $true) 
116.
117.
    New-ADGroup -Name $NewGroupName -Path $NewOu -GroupCategory Security -GroupScope Global 
118.
119.
Add-ADGroupMember -Identity $NewGroupName -Members $user 
120.
 
Ich bin ratlos, irgendwie habe ich den Verdacht dass diese Zeile dafür verantwortlich ist:
Remove-ADGroupMember -Identity $OldGroupName -Members $user -Confirm: $false

Manchmal wird der Benutzer der neuen Gruppe hinzugefügt aber nicht aus der alten gelöscht. Meistens aber aber passiert nichts und selten wird die alte Gruppe gelöscht und neue hinzugefügt.

Irgendwie veräppelt mich Windows ganz schön.

Liebe Grüße
2017-11-13 - Klicke auf das Bild, um es zu vergrößern
Mitglied: SlainteMhath
LÖSUNG 13.11.2017 um 10:28 Uhr
Moin,

dem Script fehlt's an Fehlerbehandlung... Bau um die "kritschen" Befehle einen Try...Catch block 'rum und lass dir dann evtl. Fehlermeldungen in ein Logfile oder ins Eventlog schreiben.

Ich tippe auf ein Timing-Problem. Ggfs. "spricht" das Script mit einem DC, dem die neuen User/Gruppen noch nicht repliziert wurden - gibt doch mal bei den *-AD* Cmdlets die "-Server" Option mit an.

lg,
Slainte
Bitte warten ..
Mitglied: emeriks
LÖSUNG 13.11.2017 um 10:29 Uhr
Hi,
als erstes würde ich eine Protokolierung einbauen. Lass das Script jeden seiner Schritte in ein Logfile schreiben. Mit Angabe der Daten, wie z.B. $OldOU, $NewOU usw.
z.B. Zeile 88:
01.
    'Abbruch weil NewOU leer' |  Out-File -FilePath Pfad_zum_Log -append
Damit bekommst Du heraus, wo er aufhört oder wo ein Fehler auftritt. Alles andere ist doch nur Stochern im Dunkeln.

und selten wird die alte Gruppe gelöscht und neue hinzugefügt.
Gruppe löschen? Oder meinst Du, Benutzer aus der Gruppe entfernen?

E.
Bitte warten ..
Mitglied: canlot
13.11.2017 um 13:43 Uhr
Danke euch,

ich bin einen kleinen Tacken weiter gekommen.
Try Catch Blocks halfen nicht, es kam zu keinem Fehler.
Ich habe aber herausgefunden das $NewOu und $OldOu LEER sind.

Die große Preisfrage ist warum.
Bitte warten ..
Mitglied: Specht
13.11.2017 um 14:49 Uhr
Zitat von canlot:

Danke euch,

ich bin einen kleinen Tacken weiter gekommen.
Try Catch Blocks halfen nicht, es kam zu keinem Fehler.
Ich habe aber herausgefunden das $NewOu und $OldOu LEER sind.

Die große Preisfrage ist warum.
Das hier ist ja auch Blödsinn ...
$message = Get-EventLog -LogName security -InstanceId 5139 -Newest 1 | select message | Format-List | Out-String #Benutzer erstellt
Dazu "subscribed" man das Event oder übergibt im Task-Trigger die passende Variable an das Skript!
Bitte warten ..
Mitglied: canlot
13.11.2017 um 14:59 Uhr
Zitat von Specht:

Zitat von canlot:

Danke euch,

ich bin einen kleinen Tacken weiter gekommen.
Try Catch Blocks halfen nicht, es kam zu keinem Fehler.
Ich habe aber herausgefunden das $NewOu und $OldOu LEER sind.

Die große Preisfrage ist warum.
Das hier ist ja auch Blödsinn ...
$message = Get-EventLog -LogName security -InstanceId 5139 -Newest 1 | select message | Format-List | Out-String #Benutzer erstellt
Dazu "subscribed" man das Event oder übergibt im Task-Trigger die passende Variable an das Skript!
Kannst du bitte verraten wie?
Bin für alles offen.
Bitte warten ..
Mitglied: Specht
LÖSUNG 13.11.2017 um 15:16 Uhr
Hier steht wie sowas geht (natürlich übertragen auf deine Events)
https://www.administrator.de/frage/windows-2012-r2-rdp-server-skript-dis ...
Bitte warten ..
Mitglied: colinardo
LÖSUNG 13.11.2017, aktualisiert um 16:47 Uhr
Servus,
das Skript habe ich jetzt nicht im Detail durgesehen, aber ich würde auch dazu raten die Parameter über den Tasktrigger zu übermitteln, dazu passt du die zu übermittelten Variablen wie im Link von @Specht zu sehen ist im Tasktrigger-XML an.
Die Variablen stehen im Abschnitt <ValueQueries>.

Hier ein Beispiel wie du die Daten des Events an ein Powershell-Skript via Parameter übermittelst:
(Achtung XML-Datei als Unicode speichern und dann importieren!)
01.
<?xml version="1.0" encoding="UTF-16"?> 
02.
<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> 
03.
  <RegistrationInfo> 
04.
    <Date>2017-11-13T15:57:48.6636923</Date> 
05.
  </RegistrationInfo> 
06.
  <Triggers> 
07.
    <EventTrigger> 
08.
      <Enabled>true</Enabled> 
09.
      <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Security"&gt;&lt;Select Path="Security"&gt;*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and EventID=4720]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription> 
10.
      <ValueQueries> 
11.
        <Value name="DisplayName">Event/EventData/Data[@Name='DisplayName']</Value> 
12.
        <Value name="Logged">Event/System/TimeCreated/@SystemTime</Value> 
13.
        <Value name="PrimaryGroupId">Event/EventData/Data[@Name='PrimaryGroupId']</Value> 
14.
        <Value name="SamAccountName">Event/EventData/Data[@Name='SamAccountName']</Value> 
15.
        <Value name="SubjectUserName">Event/EventData/Data[@Name='SubjectUserName']</Value> 
16.
        <Value name="UserPrincipalName">Event/EventData/Data[@Name='UserPrincipalName']</Value> 
17.
      </ValueQueries> 
18.
    </EventTrigger> 
19.
  </Triggers> 
20.
  <Principals> 
21.
    <Principal id="Author"> 
22.
      <UserId>S-1-5-18</UserId> 
23.
      <RunLevel>HighestAvailable</RunLevel> 
24.
    </Principal> 
25.
  </Principals> 
26.
  <Settings> 
27.
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> 
28.
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries> 
29.
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries> 
30.
    <AllowHardTerminate>true</AllowHardTerminate> 
31.
    <StartWhenAvailable>false</StartWhenAvailable> 
32.
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> 
33.
    <IdleSettings> 
34.
      <StopOnIdleEnd>true</StopOnIdleEnd> 
35.
      <RestartOnIdle>false</RestartOnIdle> 
36.
    </IdleSettings> 
37.
    <AllowStartOnDemand>true</AllowStartOnDemand> 
38.
    <Enabled>true</Enabled> 
39.
    <Hidden>false</Hidden> 
40.
    <RunOnlyIfIdle>false</RunOnlyIfIdle> 
41.
    <DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession> 
42.
    <UseUnifiedSchedulingEngine>false</UseUnifiedSchedulingEngine> 
43.
    <WakeToRun>false</WakeToRun> 
44.
    <ExecutionTimeLimit>P3D</ExecutionTimeLimit> 
45.
    <Priority>7</Priority> 
46.
  </Settings> 
47.
  <Actions Context="Author"> 
48.
    <Exec> 
49.
      <Command>powershell.exe</Command> 
50.
      <Arguments>-NoProfile -File "C:\testscript.ps1" -SamAccountName "$(SamAccountName)" -SubjectUserName "$(SubjectUserName)"</Arguments> 
51.
    </Exec> 
52.
  </Actions> 
53.
</Task>
Und nutzen kannst du die Variablen dann so in einem PS-Skript:
01.
param( 
02.
	[string]$SamAccountName, 
03.
	[string]$SubjectUserName 
04.
05.
 
06.
"Benutzer mit Namen: '$SamAccountName' wurde von Benutzer: '$SubjectUserName' erstellt." | sc 'C:\log.txt'
Alternativ kann man natürlich auch das Eventlog über ein PS-Skript überwachen. Das müsste dann aber ständig laufen damit die Events dort abgefangen werden können, insofern ist hier ein Tasktrigger die bessere Wahl.

Btw. wenn du es unbedingt via Get-Eventlog auslesen willst wäre
$username = Get-Eventlog -LogName Security -InstanceId 4720 -Newest 1 | %{$_.ReplacementStrings[0]}
oder auch
$username = ([xml](Get-WinEvent -LogName Security -FilterXPath "*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and (EventID=4720)]]" -Max 1).toXML()).Event.EventData.Data | ?{$_.Name -eq 'SamAccountName'} | %{$_.'#text'}
die schönere Variante (Bsp zum Auslesen den Usernames bei Useranlage), als erst als Format-Table, dann als String und dann noch mit Regex zu extrahieren, das ist doch sehr unschön .

Grüße Uwe
Bitte warten ..
Mitglied: canlot
14.11.2017 um 09:00 Uhr
@colinardo

Hallo Uwe,

danke für die Antwort.
Ich habe mein Script jetzt umgeschrieben. Die XML Datei habe ich exportiert und dann die Queries eingefügt.

01.
<?xml version="1.0" encoding="UTF-16"?> 
02.
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> 
03.
  <RegistrationInfo> 
04.
    <Date>2017-11-13T13:19:02.9719722</Date> 
05.
    <Author>Firma\Benutzer</Author> 
06.
  </RegistrationInfo> 
07.
  <Triggers> 
08.
    <EventTrigger> 
09.
      <Enabled>true</Enabled> 
10.
      <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Security"&gt;&lt;Select Path="Security"&gt;*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and EventID=5139]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription> 
11.
      <ValueQueries> 
12.
        <Value name="Class">Event/EventData/Data[@Name='ObjectClass']</Value> 
13.
        <Value name="GUID">Event/EventData/Data[@Name='ObjectGUID']</Value> 
14.
        <Value name="NewOU">Event/EventData/Data[@Name='NewObjectDN']</Value> 
15.
        <Value name="OldOU">Event/EventData/Data[@Name='OldObjectDN']</Value> 
16.
      </ValueQueries> 
17.
    </EventTrigger> 
18.
  </Triggers> 
19.
  <Principals> 
20.
    <Principal id="Author"> 
21.
      <UserId>Firma\Administrator</UserId> 
22.
      <LogonType>Password</LogonType> 
23.
      <RunLevel>LeastPrivilege</RunLevel> 
24.
    </Principal> 
25.
  </Principals> 
26.
  <Settings> 
27.
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> 
28.
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries> 
29.
    <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> 
30.
    <AllowHardTerminate>false</AllowHardTerminate> 
31.
    <StartWhenAvailable>false</StartWhenAvailable> 
32.
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> 
33.
    <IdleSettings> 
34.
      <StopOnIdleEnd>true</StopOnIdleEnd> 
35.
      <RestartOnIdle>false</RestartOnIdle> 
36.
    </IdleSettings> 
37.
    <AllowStartOnDemand>true</AllowStartOnDemand> 
38.
    <Enabled>true</Enabled> 
39.
    <Hidden>false</Hidden> 
40.
    <RunOnlyIfIdle>false</RunOnlyIfIdle> 
41.
    <WakeToRun>false</WakeToRun> 
42.
    <ExecutionTimeLimit>P3D</ExecutionTimeLimit> 
43.
    <Priority>7</Priority> 
44.
  </Settings> 
45.
  <Actions Context="Author"> 
46.
    <Exec> 
47.
      <Command>powershell</Command> 
48.
      <Arguments>-NoProfile -File "C:\Script\MoveToOtherOu.ps1" -OldOu "$(OldOu)" -NewOu "$(NewOu)" -GUID "$(GUID)" -Class "$(Class)"</Arguments> 
49.
    </Exec> 
50.
  </Actions> 
51.
</Task>
Und das Script:

01.
 
02.
Param 
03.
04.
    [string]$OldOu, 
05.
    [string]$NewOu, 
06.
    [string]$GUID, 
07.
    [string]$Class 
08.
09.
 
10.
$OldOu | Out-File -FilePath "C:\Users\Benutzer\Documents\logMoveToOtherOu.txt" -Append 
11.
$NewOu | Out-File -FilePath "C:\Users\Benutzer\Documents\logMoveToOtherOu.txt" -Append 
12.
$GUID | Out-File -FilePath "C:\Users\Benutzer\Documents\logMoveToOtherOu.txt" -Append 
13.
$Class | Out-File -FilePath "C:\Users\Benutzer\Documents\logMoveToOtherOu.txt" -Append 
14.
 
15.
$BaseOu = "OU=Firma,DC=intern,DC=firma,DC=de" 
16.
 
17.
 
18.
if($Class -ne "user") 
19.
20.
    Exit 
21.
22.
 
23.
 
24.
$OldOu = $OldOu.Remove(0, $OldOu.IndexOf(',',0)+1) 
25.
$OldOu = $OldOu.Remove(0, $OldOu.IndexOf(',',0)+1) 
26.
 
27.
if($OldOu -eq $null -or $OldOu -eq "") 
28.
29.
    Exit 
30.
31.
 
32.
$NewOu = $NewOu.Remove(0, $NewOu.IndexOf(',',0)+1) 
33.
$NewOu = $NewOu.Remove(0, $NewOu.IndexOf(',',0)+1) 
34.
 
35.
if($NewOu -eq $null -or $NewOu -eq "") 
36.
37.
    Exit 
38.
39.
 
40.
$userGUID = $userGUID.Trim("{") 
41.
$userGUID = $userGUID.Trim("}") 
42.
 
43.
$user = Get-ADUser -Identity $userGUID 
44.
#Write-Host $userGUID 
45.
#Write-Host $user 
46.
#Write-Host $message 
47.
 
48.
 
49.
$OldGroupName = GetGroupName($OldOu) 
50.
$NewGroupName = GetGroupName($NewOu) 
51.
 
52.
$OldGroupName | Out-File -FilePath "C:\Users\Benutzer\Documents\logMoveToOtherOu.txt" -Append 
53.
$NewGroupName | Out-File -FilePath "C:\Users\Benutzer\Documents\logMoveToOtherOu.txt" -Append 
54.
 
55.
if($NewGroupName -eq $false) 
56.
57.
    $text = "Gruppenname leer" 
58.
    $text | Out-File -FilePath "C:\Users\Benutzer\Documents\logMoveToOtherOu.txt" -Append 
59.
    Exit 
60.
61.
try 
62.
63.
    if(Get-ADPrincipalGroupMembership $user | select name | where name -eq $OldGroupName) 
64.
65.
        Remove-ADGroupMember -Identity $OldGroupName -Members $user -Confirm: $false 
66.
67.
68.
catch 
69.
70.
    $FailMessage = "Fail: " + $_.Exception.Message + " " + $_.Exception.ItemName 
71.
    $FailMessage | Out-File -FilePath "C:\Users\Benutzer\Documents\logMoveToOtherOu.txt" -Append 
72.
73.
 
74.
try 
75.
76.
    if((Get-ADGroup -SearchBase $BaseOu -Filter * | select name | where name -eq $NewGroupName) -ne $true)  
77.
78.
        New-ADGroup -Name $NewGroupName -Path $NewOu -GroupCategory Security -GroupScope Global 
79.
80.
     
81.
82.
catch 
83.
84.
    $FailMessage = "Fail: " + $_.Exception.Message + " " + $_.Exception.ItemName 
85.
    $FailMessage | Out-File -FilePath "C:\Users\Benutzer\Documents\logMoveToOtherOu.txt" -Append 
86.
87.
Add-ADGroupMember -Identity $NewGroupName -Members $user
Die Variablen die ich dem Script übergebe bleiben aber leer.

$OldOu | Out-File -FilePath "C:\Users\Benutzer\Documents\logMoveToOtherOu.txt" -Append
$NewOu | Out-File -FilePath "C:\Users\Benutzer\Documents\logMoveToOtherOu.txt" -Append
$GUID | Out-File -FilePath "C:\Users\Benutzer\Documents\logMoveToOtherOu.txt" -Append
$Class | Out-File -FilePath "C:\Users\Benutzer\Documents\logMoveToOtherOu.txt" -Append

In der Datei steht nichts drin.
Bitte warten ..
Mitglied: Specht
LÖSUNG 14.11.2017, aktualisiert um 09:07 Uhr
Groß und Kleinschreibung der Variablen im Argument beachten, deine stimmen nicht überein...
OldOU ist nicht gleich OldOu.
Bitte warten ..
Mitglied: canlot
14.11.2017 um 09:15 Uhr
Zitat von Specht:

Groß und Kleinschreibung der Variablen im Argument beachten, deine stimmen nicht überein...
OldOU ist nicht gleich OldOu.
Huch, wie hat sich das da eingeschlichen, ich habe eigentlich peinlich genau auf die Groß-Kleinschreibung geachtet.

Danke, aber es geht immer noch nicht, die Variablen bleiben leer.
Bitte warten ..
Mitglied: Specht
LÖSUNG 14.11.2017, aktualisiert um 09:20 Uhr
Param steht bei dir nicht in der ersten Zeile.
Und für den Rest Binde ein Start-Transcript und Stop-Transcript in dein Skript ein.
Und der Account benötigt natürlich Schreibrechte in den Ziel-Ordner!!
Geht hier problemlos.
Bitte warten ..
Mitglied: emeriks
14.11.2017, aktualisiert um 09:21 Uhr
Wird denn die Logdatei überhaupt um Leerzeilen aktualisiert? Falls nein, dann schreibt er bloß nicht ins Log. In diesem Fall, nimm noch besser einen Pfad ausserhalb der Benutzerprofile, z.B. einen im %ProgramData%.
Bitte warten ..
Mitglied: canlot
14.11.2017 um 12:18 Uhr
Zitat von Specht:

Param steht bei dir nicht in der ersten Zeile.
Und für den Rest Binde ein Start-Transcript und Stop-Transcript in dein Skript ein.
Und der Account benötigt natürlich Schreibrechte in den Ziel-Ordner!!
Geht hier problemlos.
Danke, den Tipp mit den Parametern wusste ich noch nicht, das hat das Problem mit den leeren Variablen gelöst.
Ich hatte aber noch andere Fehler im Script. z.B. habe ich statt $GUID $userGUID verwendet und statt Get-ADGroupMember, Get-ADPrincipalGroupMember.
Bitte warten ..
Mitglied: canlot
14.11.2017 um 12:26 Uhr
Danke noch mal an alle!!!

Ich schreibe hier mal die Lösung, vielleicht benötigt jemand sie mal.

Also wie @colinardo beschrieben hat, das Ereignis exportieren und die Querie-Werte einfügen.
Meine fertige XML-Datei sieht so aus:

01.
<?xml version="1.0" encoding="UTF-16"?> 
02.
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> 
03.
  <RegistrationInfo> 
04.
    <Date>2017-11-13T13:19:02.9719722</Date> 
05.
    <Author>FIRMA\Benutzer</Author> 
06.
  </RegistrationInfo> 
07.
  <Triggers> 
08.
    <EventTrigger> 
09.
      <Enabled>true</Enabled> 
10.
      <Subscription>&lt;QueryList&gt;&lt;Query Id="0" Path="Security"&gt;&lt;Select Path="Security"&gt;*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and EventID=5139]]&lt;/Select&gt;&lt;/Query&gt;&lt;/QueryList&gt;</Subscription> 
11.
      <ValueQueries> 
12.
        <Value name="Class">Event/EventData/Data[@Name='ObjectClass']</Value> 
13.
        <Value name="GUID">Event/EventData/Data[@Name='ObjectGUID']</Value> 
14.
        <Value name="NewOu">Event/EventData/Data[@Name='NewObjectDN']</Value> 
15.
        <Value name="OldOu">Event/EventData/Data[@Name='OldObjectDN']</Value> 
16.
      </ValueQueries> 
17.
    </EventTrigger> 
18.
  </Triggers> 
19.
  <Principals> 
20.
    <Principal id="Author"> 
21.
      <UserId>FIRMA\Administrator</UserId> 
22.
      <LogonType>Password</LogonType> 
23.
      <RunLevel>LeastPrivilege</RunLevel> 
24.
    </Principal> 
25.
  </Principals> 
26.
  <Settings> 
27.
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> 
28.
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries> 
29.
    <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> 
30.
    <AllowHardTerminate>false</AllowHardTerminate> 
31.
    <StartWhenAvailable>false</StartWhenAvailable> 
32.
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> 
33.
    <IdleSettings> 
34.
      <StopOnIdleEnd>true</StopOnIdleEnd> 
35.
      <RestartOnIdle>false</RestartOnIdle> 
36.
    </IdleSettings> 
37.
    <AllowStartOnDemand>true</AllowStartOnDemand> 
38.
    <Enabled>true</Enabled> 
39.
    <Hidden>false</Hidden> 
40.
    <RunOnlyIfIdle>false</RunOnlyIfIdle> 
41.
    <WakeToRun>false</WakeToRun> 
42.
    <ExecutionTimeLimit>P3D</ExecutionTimeLimit> 
43.
    <Priority>7</Priority> 
44.
  </Settings> 
45.
  <Actions Context="Author"> 
46.
    <Exec> 
47.
      <Command>powershell</Command> 
48.
      <Arguments>-NoProfile -File "C:\Script\MoveToOtherOu.ps1" -OldOu "$(OldOu)" -NewOu "$(NewOu)" -GUID "$(GUID)" -Class "$(Class)"</Arguments> 
49.
    </Exec> 
50.
  </Actions> 
51.
</Task>
Firma und Benutzer durch die Domäne und euren Benutzer ersetzen. Dann die Datei wieder importieren.

Das PS Script sieht dann so aus:
01.
02.
    [string]$OldOu, 
03.
    [string]$NewOu, 
04.
    [string]$GUID, 
05.
    [string]$Class 
06.
07.
 
08.
$filePath = "C:\Users\benutzer\Documents\logMoveToOtherOu.txt" 
09.
$BaseOu = "OU=firma,DC=intern,DC=firma,DC=de" 
10.
 
11.
"                                                  " | Out-File -FilePath $filePath -Append 
12.
"-----------------" + (Get-Date).ToUniversalTime() + "-----------------" | Out-File -FilePath $filePath -Append 
13.
"                                                  " | Out-File -FilePath $filePath -Append 
14.
 
15.
$OldOu | Out-File -FilePath $filePath -Append 
16.
$NewOu | Out-File -FilePath $filePath -Append 
17.
$GUID | Out-File -FilePath $filePath -Append 
18.
$Class | Out-File -FilePath $filePath -Append 
19.
 
20.
 
21.
 
22.
 
23.
if($Class -ne "user") 
24.
25.
    Exit 
26.
27.
 
28.
 
29.
$OldOu = $OldOu.Remove(0, $OldOu.IndexOf(',',0)+1) 
30.
$OldOu = $OldOu.Remove(0, $OldOu.IndexOf(',',0)+1) 
31.
 
32.
if($OldOu -eq $null -or $OldOu -eq "") 
33.
34.
    Exit 
35.
36.
 
37.
$NewOu = $NewOu.Remove(0, $NewOu.IndexOf(',',0)+1) 
38.
$NewOu = $NewOu.Remove(0, $NewOu.IndexOf(',',0)+1) 
39.
 
40.
if($NewOu -eq $null -or $NewOu -eq "") 
41.
42.
    Exit 
43.
44.
 
45.
 
46.
$user = Get-ADUser -Identity $GUID 
47.
 
48.
function GetCityName($City) 
49.
50.
    switch($City) 
51.
52.
        "Berlin" {return "BER"} 
53.
        "München" {return "MUN"} 
54.
        "London" {return "LON"} 
55.
        "Madrid" {return "MAD"} 
56.
        "Paris" {return "PAR"} 
57.
        "Warschau" {return "WAR"} 
58.
        default { return $false} 
59.
 
60.
 
61.
62.
63.
 
64.
function GetGroupName($OuName) 
65.
66.
    $groupName = "" 
67.
 
68.
    $OuArray = $OuName.Split(",") 
69.
 
70.
    $City = GetCityName($OuArray[-6].Split("=")[1]) 
71.
    if($City -eq $false) 
72.
73.
        return $false 
74.
75.
     
76.
    $specialGroup = "" 
77.
    $department = "" 
78.
    if($OuArray[-7].Split("=")[1] -eq "Special Groups") 
79.
80.
        $specialGroup = "SP" 
81.
        $groupName = "GRP_" + $City + "_" + $specialGroup 
82.
        for($counter = $OuArray.Count - 8; $counter -ge 0; $counter--) 
83.
84.
            $item = $OuArray[$counter].Split("=")[1] 
85.
            $groupName = $groupName + "_" + $item 
86.
87.
88.
    else 
89.
90.
        $groupName = "GRP_" + $City 
91.
        for($counter = $OuArray.Count - 7; $counter -ge 0; $counter--) 
92.
93.
            $item = $OuArray[$counter].Split("=")[1] 
94.
            $groupName = $groupName + "_" + $item 
95.
96.
97.
     
98.
    return $groupName 
99.
     
100.
101.
 
102.
$OldGroupName = GetGroupName($OldOu) 
103.
$NewGroupName = GetGroupName($NewOu) 
104.
 
105.
$OldGroupName | Out-File -FilePath $filePath -Append 
106.
$NewGroupName | Out-File -FilePath $filePath -Append 
107.
 
108.
if($NewGroupName -eq $false) 
109.
110.
    $text = "Gruppenname leer" 
111.
    $text | Out-File -FilePath $filePath -Append 
112.
    Exit 
113.
114.
#Get-ADPrincipalGroupMembership $user | select name | Out-File -FilePath $filePath -Append 
115.
try 
116.
117.
    Remove-ADGroupMember -Identity $OldGroupName -Members $user -Confirm: $false 
118.
119.
catch 
120.
121.
    $FailMessage = "Fail: " + $_.Exception.Message + " " + $_.Exception.ItemName 
122.
    $FailMessage | Out-File -FilePath $filePath -Append 
123.
124.
 
125.
try 
126.
127.
    if((Get-ADGroup -SearchBase $BaseOu -Filter * | select name | where name -eq $NewGroupName) -ne $true)  
128.
129.
        New-ADGroup -Name $NewGroupName -Path $NewOu -GroupCategory Security -GroupScope Global 
130.
131.
     
132.
133.
catch 
134.
135.
    $FailMessage = "Fail: " + $_.Exception.Message + " " + $_.Exception.ItemName 
136.
    $FailMessage | Out-File -FilePath $filePath -Append 
137.
138.
try 
139.
140.
    Add-ADGroupMember -Identity $NewGroupName -Members $user 
141.
142.
catch 
143.
144.
    $FailMessage = "Fail: " + $_.Exception.Message + " " + $_.Exception.ItemName 
145.
    $FailMessage | Out-File -FilePath $filePath -Append 
146.
}
Leider ohne Kommentare
Bitte warten ..
Ähnliche Inhalte
Windows Server
PowerShell Script - Ordnerrechte setzen (7)

Frage von desmondjames zum Thema Windows Server ...

Vmware
gelöst VMware Powershell CLI Scripts (15)

Frage von vinevg zum Thema Vmware ...

Windows 10
Windows 10 Powershell Logon Script (9)

Frage von derhoeppi zum Thema Windows 10 ...

Entwicklung
gelöst Powershell Script: In Forest nach Computernamen suchen (13)

Frage von Agilolfinger zum Thema Entwicklung ...

Neue Wissensbeiträge
Multimedia

Raspberry Pi als Digital-Signage-Computer

(1)

Information von BassFishFox zum Thema Multimedia ...

Windows Update

Novemberpatches und Nadeldrucker bereiten Kopfschmerzen

(15)

Tipp von MettGurke zum Thema Windows Update ...

Windows 10

Abhilfe für Abstürze von CDPUsersvc auf Win10 1607 und 2016 1607

(7)

Tipp von DerWoWusste zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Router & Routing
Freigabe aus anderem Netz nicht erreichbar (31)

Frage von McLion zum Thema Router & Routing ...

Visual Studio
Vb.net-Tool zum Erzeugen einer Outlook-E-Mail (24)

Frage von ahstax zum Thema Visual Studio ...

Batch & Shell
Batch Programm verhalten bei shoutdown -p (19)

Frage von Michael-ITler zum Thema Batch & Shell ...

Windows Netzwerk
Netzwerk Neustrukturierung (15)

Frage von IT-Dreamer zum Thema Windows Netzwerk ...