Client per Script einer AD Gruppe hinzufügen

Post Reply
CSchlingmann
Posts: 41
Joined: 07. Mar 2012, 09:05
Contact:

Client per Script einer AD Gruppe hinzufügen

Post by CSchlingmann » 27. Apr 2017, 10:37

Hallo zusammen,

ich bin dabei ein Paket zu fertigen, mit dem man ein Client per PowerShell Script in eine AD Gruppe hinzufügen kann.
Wir haben mehrere AD Gruppen worüber dann wiederrum GPOs aktiv werden etc. Um das innerhalb der AD nicht immer manuell machen zu müssen kam die Idee, dies direkt durch Empirum machen zu lassen.

Das PowerShell Script welches ich gebaut habe funktioniert auch wenn man es manuell ausführt

Code: Select all

$s = new-pssession -computer "DC"
Invoke-Command -session $s -script { Import-Module ActiveDirectory }
Import-PSSession -session $s -module ActiveDirectory -prefix Rem

$client = $env:computername + "$"
Add-RemADGroupMember "AD-Gruppe" -members $client

$s | Remove-PSSession
Um die Active Directory cmdlets zu nutzen wird Remote auf den DomänenController zugegriffen. Mit der entspechenden Berechtigung funktioniert das auch.

Um das PowerShell Script mit einem berechtigten Benutzer auszufrühen nutze ich psexec.

Mein Aufruf im Empirum Paket sieht nun wie folgt aus:

Code: Select all

[Set:Product]
Call "%SRC%\psexec.exe" -u domain\privilegierterBenutzer -p %pw% powershell.exe -executionpolicy bypass -file "%SRC%\PowerShellScript.ps1"
%pw% ist im Bereich [Encryption] hinterlegt

Das Ausführen von Scripten ist am Client ebenfalls aktiviert.


Meiner Meinung nach sieht alles richtig aus. Wenn ich das Paket manuell mit dem Empirum Package Editor ausführe klappt es auch.

Nur wenn das Paket mittels Advanced Agent ausgeführt wird dann wird das Paket in einer Sekunde abgearbeitet und als erfolgreich abgestempelt.

Ich habe schomal testweise einen anderen Aufruf versucht, welcher aber ebenfalls nicht ausgeführt wird, zumindest sehe ich es nicht.

Code: Select all

Call "%SRC%\psexec.exe" -u domain\privilegierterBenutzer -p %pw% powershell.exe
oder

Code: Select all

Call "%SRC%\psexec.exe" -u domain\privilegierterBenutzer -p %pw% calc.exe

Wo ist mein Fehler?! :|



Eim Einsatz ist Empirum 16.0.3.4026

f48614
Posts: 225
Joined: 24. Apr 2007, 14:38
Contact:

Re: Client per Script einer AD Gruppe hinzufügen

Post by f48614 » 27. Apr 2017, 10:55

Hallo,

ich habe das vor einiger Zeit folgendermaßen gelöst


callhidden "c:\windows\SysWoW64\cmd.exe" /C c:\windows\pcwRunAs3.exe /d domäne.com /u username /p %WLANPassword% /app "cmd.exe /C net group role-wireless-clients %computername%$ /add /domain"


Dieses Script musste allerdings im Userteil (/AW) laufen, da es entweder eine Einschränkung von pcwRunAs3.exe ist oder eine Windows Limitierung das man aus dem Systemkontext nicht in andere Userkontexte springen darf.

Gruß
Thomas
Empirum v18.0 + EPE 4.7.1
Testsystem Empirum v18.0

CSchlingmann
Posts: 41
Joined: 07. Mar 2012, 09:05
Contact:

Re: Client per Script einer AD Gruppe hinzufügen

Post by CSchlingmann » 28. Apr 2017, 08:52

Guten morgen Thomas,

vielen Dank für deine Rückmeldung. Der Hinweis das Windows es verweigert aus dem Systemkontext in ein Userkontext zu wechseln war sehr interessant und für mich neu. Ich konnte es aber nachstellen und bestätigen.

Die Ausführung im Userkontext konnte mein Problem sogar beheben. Doch das war nicht mein Ziel. Als Benutzerteil wird zum einen das "Paket" zu spät ausgeführt und zudem auch bei jedem angemeldeten User.

Das Paket soll nach der Windows Installation direkt ausgeführt werden. Ich konnte aber mit diesen Hinweisen mein Paket erfolgreich anpassen. Die Credentials nutze ich nun nicht im Empirum Paket sondern im PowerShell Script.

Hier mal meine Lösung für alle die es interessiert 8)

Empirum Paket

Code: Select all

#Reg:ProductAdd
#Set:Product
#Reg:ProductDel

[Reg:ProductAdd]
HKLM,"SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell","ExecutionPolicy",0x00000000,"RemoteSigned"

[Set:Product]
Sleep 1000
-Call powershell.exe -executionpolicy bypass -file "%SRC%\Remove-PowerShellScript.ps1" %pw%
Call powershell.exe -executionpolicy bypass -file "%SRC%\Add-PowerShellScript.ps1" %pw%
Sleep 1000

[Reg:ProductDel]
-HKLM,"SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell","ExecutionPolicy",0x00000000,"RemoteSigned"
mit %pw% übergebe ich das verschlüsselte Passwort an das PowerShell-Script.

Das PowerShell-Script

Code: Select all

$username = 'domain\user'
$password = $args[0]
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword

$s = new-pssession -computer "DC" -Credential $credential
Invoke-Command -session $s -script { Import-Module ActiveDirectory }
Import-PSSession -session $s -module ActiveDirectory -prefix Rem

$client = $env:computername + "$"
Add-RemADGroupMember "AD-Gruppe" -members $client

$s | Remove-PSSession
und bei der Deinstallation des Paketes wird dieses Script ausgeführt

Code: Select all

$username = 'domain\user'
$password = $args[0]
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword

$s = new-pssession -computer "DC" -Credential $credential
Invoke-Command -session $s -script { Import-Module ActiveDirectory }
Import-PSSession -session $s -module ActiveDirectory -prefix Rem

$client = $env:computername + "$"
Remove-RemADGroupMember "AD-Gruppe" -members $client

$s | Remove-PSSession
Im Endeffekt einleuchtend und simpel. :mrgreen:

Gruß
Christian

PetCh01

Re: Client per Script einer AD Gruppe hinzufügen

Post by PetCh01 » 09. Mar 2018, 15:55

Ah netter Thread, Danke für den Hinweis mit dem Userkontext, ich war nahe dran, das durch schräges Testen heraus zu finden und dachte mir ich "suche" mal hier ;-)

Meine ähnliche Lösung:

Code: Select all

#----------------------------------------------
#Add Groups to executing Computer via PowerShell (Global)
#----------------------------------------------
# by PetCh01 @ 2018-03-09
#----------------------------------------------

#YOURDC DomainController per Netzmaske zb. herausfinden und übergeben
$username = 'user'
$itempwd= $args[0]
$secureitempwd = ConvertTo-SecureString $itempwd -AsPlainText -Force
$credentials = New-Object System.Management.Automation.PSCredential $username, $secureitempwd

$Session = New-PSSession -ComputerName YOURDC -Credential $credentials
$ThisHostname = $env:computername + '$'

Invoke-Command -Session $Session -Command {Add-ADGroupMember 'Group1' -Members $($args[0])} -ArgumentList $ThisHostname
Invoke-Command -Session $Session -Command {Add-ADGroupMember 'Group2' -Members $($args[0])} -ArgumentList $ThisHostname
Invoke-Command -Session $Session -Command {Add-ADGroupMember 'Group3' -Members $($args[0])} -ArgumentList $ThisHostname
$Session | Remove-PSSession
GroupChecker

Code: Select all

#----------------------------------------------
#Check added Group status via PowerShell (Global)
#----------------------------------------------
# by PetCh01 @ 2018-03-09
#----------------------------------------------

#YOURDC DomainController per Netzmaske zb. herausfinden und übergeben
$username = 'user'
$itempwd = $args[0]
$secureitempwd = ConvertTo-SecureString $itempwd -AsPlainText -Force
$credentials = New-Object System.Management.Automation.PSCredential $username, $secureitempwd

$Session = New-PSSession -ComputerName YOURDC -Credential $credentials

$ThisHostname = $env:computername + '$'
$Group1Check = 0
$Group2Check = 0
$Group3Check = 0
$GroupMembership = 0
$Group1 = 'CN=GROUP1,OU=SubGroup,OU=GROUPS,OU=Root,DC=your,DC=domain,DC=com'
$Group2 = 'CN=GROUP2,OU=SubGroup,OU=GROUPS,OU=Root,DC=your,DC=domain,DC=com'
$Group3 = 'CN=GROUP3,OU=SubGroup,OU=GROUPS,OU=Root,DC=your,DC=domain,DC=com'
$CheckFile = $env:windir + '\system32\yourcheckfile.txt'
$GroupMembership = Invoke-Command -Session $Session -Command {(Get-ADComputer –Identity $($args[0]) –Properties MemberOf -ErrorAction SilentlyContinue | Select-Object MemberOf).MemberOf} -ArgumentList $ThisHostname
If ($GroupMembership -contains $Group1) { $Group1Check = 1 } Else { $Group1Check = 0 }
If ($GroupMembership -contains $Group2) { $Group2Check = 1 } Else { $Group2Check = 0 }
If ($GroupMembership -contains $Group3) { $Group3Check = 1 } Else { $Group3Check = 0 }
$CheckExistence = Get-Item -Path $CheckFile -ErrorAction SilentlyContinue | Test-Path
If ($CheckExistence -ne $True) { New-Item $CheckFile -ItemType File }
If ($Group1Check -eq 1) { 'GROUP1' + ' added to ' + $ThisHostname | Add-content $CheckFile } Else { 'GROUP1' + ' adding FAILED on ' + $ThisHostname | Add-content $CheckFile }
If ($Group2Check -eq 1) { 'GROUP2' + ' added to ' + $ThisHostname | Add-content $CheckFile }  Else { 'GROUP2' + ' adding FAILED on ' + $ThisHostname | Add-content $CheckFile }
If ($Group3Check -eq 1) { 'GROUP3' + ' added to ' + $ThisHostname | Add-content $CheckFile }  Else { 'GROUP3' + ' adding FAILED on ' + $ThisHostname | Add-content $CheckFile }
If ($Group1Check -eq 1 -And $Group2Check -eq 1 -And $Group3Check -eq 1) { 'GroupAddCompleted' | Add-content $CheckFile }
$Session | Remove-PSSession
Im Empirumpaket ist mein Erfolgscheck dann auf "GroupAddCompleted" im entsprechenden %checkfile% ;-)
Wenn Fail im Text gibtsn Error und um das auf verschiedene RZs an zu wenden Checkt man den DC vorher per Netzmaske ab und ügibt ihn entsprechend.
Alternativ geht natürlich auch eine Empirumvariable.

Post Reply

Return to “Paketierung”

Who is online

Users browsing this forum: No registered users and 1 guest