Top-Themen

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

Mitglied: canlot

canlot (Level 1) - Jetzt verbinden

13.11.2017 um 09:46 Uhr, 238 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: 134464
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 134464:

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: 134464
LÖSUNG 13.11.2017 um 15:16 Uhr
Hier steht wie sowas geht (natürlich übertragen auf deine Events)
https://www.administrator.de/forum/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: 134464
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 134464:

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: 134464
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 134464:

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 funktioniert nach Einteilung in Funktionen nicht mehr richtig...

gelöst Frage von gabeBUWindows Server3 Kommentare

Hallo Zusammen Ich habe ja in letzter Zeit häufiger was wegen Powershell gepostet. Grundsätzlich funktioniert das Script, nur wollte ...

Batch & Shell

Powershell Script zum ändern von bestimmten Strings funktioniert nicht richtig

gelöst Frage von Mars123Batch & Shell16 Kommentare

Guten Tag, ich arbeite momentan an einem Powershell Script das bestimmte Strings in einer Textdatei sucht und durch einen ...

Batch & Shell

Powershell Mousedown Event

gelöst Frage von SaschaRDBatch & Shell2 Kommentare

Hallo zusammen, kennt jemand das Pendat zu diesem Code?: Suche dieselbe Funktion in Powershell (der o.g. Code ist VB). ...

Batch & Shell

Powershell funktioniert nicht richtig beim Auslesen der letzten Zeile

gelöst Frage von Peter32Batch & Shell5 Kommentare

Hallo, mein code lautet: Wieso erhalte ich als Ausgabe: Kann ich eigentlich auch die letzte Zeile direkt aus der ...

Neue Wissensbeiträge
Sicherheit
Sicherheitsrisiko: Die Krux mit 7-Zip
Information von kgborn vor 6 StundenSicherheit

Bei vielen Anwendern ist das Tool 7-Zip zum Entpacken von Archivdateien im Einsatz. Die Software ist kostenlos und steht ...

Internet

Datendealing im WWW Tracking Methoden immer brutaler

Information von sabines vor 16 StundenInternet

Interessanter Artikel zum Thema Tracking im WWW und die immer "besseren" Methoden des Trackings. Professor Arvind Narayanan (Princeton-Universität) betreibt ...

Erkennung und -Abwehr

Ups: Einfaches Nullzeichen hebelte den Anti-Malware-Schutzt in Windows 10 aus

Information von kgborn vor 1 TagErkennung und -Abwehr

Windows 10 ist das sicherste Windows aller Zeiten, wie Microsoft betont. Insidern ist aber klar, das es da Lücken, ...

Windows 10

Windows 10 on ARM: von Microsoft entfernte Info - Klartext, was nicht geht

Information von kgborn vor 1 TagWindows 10

Windows 10 on ARM ist ja eine neue Variante, die Microsoft im Verbund mit Geräteherstellern am Markt etablieren will. ...

Heiß diskutierte Inhalte
Server
Route-Befehl Unterstützung (unter CMD)
gelöst Frage von FKRR56Server36 Kommentare

Guten Tag , i.M. habe ich Probleme über den CMD-Route-Befehl ein Routing auf einen entfernten Server zuzulassen. Der Server ...

Windows 10
Windows 10 (1709) Tastur und Maus wieder einschalten?
Frage von LochkartenstanzerWindows 1028 Kommentare

Moin, Ich habe von einem Kunden einen Win10-Rechner bekommen, bei dem weder Tastatur noch Maus geht. Die Hardware funktioniert ...

Microsoft
TV-Tipp: Das Microsoft-Dilemma
Information von kgbornMicrosoft17 Kommentare

Aktuell gibt es in Behörden und in Firmen eine fatale Abhängigkeit von Microsoft und dessen Produkten. Planlos agieren die ...

Webbrowser
Welcher Browser ist der Beste?
Frage von justtinWebbrowser15 Kommentare

Hallo Leute Ich habe eine interessante Frage. Mich wurde mal interessieren welcher Browser ist eure meinung nach der beste? ...