none
Sicherheitsabfrage einbauen

    Frage

  • Hallo zusammen,

    wir arbeiten sehr viel im AD und müssen immer wieder User neu anlegen oder verschieben. Damit die Arbeit etwas schneller von der Hand geht, habe ich im Netz nach einem Script gesucht welches die entsprechenden Gruppen von einem Musteruser auf einen neuen kopiert. Jedoch enthält dieses Script keine Sicherheitsabfrage ala "Sind Sie sicher?". Da ich mich noch sehr wenig in der Powershell auskenne brauche ich etwas Hilfe dabei. Kann mir jemand helfen den Ansatz zu finden? Es handelt sich um dieses Script: https://www.frankysweb.de/quick-and-dirty-active-directory-gruppen-von-benutzer-zu-benutzer-kopieren/

    Danke und Grüße,

    Andreas

    Montag, 25. März 2019 06:22

Antworten

  • Hallo Flash, 

    der Parameter -Confirm ist für das entsprechende CmdLet und nicht für die Funktion.

    sprich, das hilft Dir nicht

    was Du machen kannst ist in der Click Funktion eine "Sicherheitsfunktion einzubauen"

    Function get-userproofing
    {
    	$title = 'Sicherheitsabfrage '
    	$prompt = 'Soll die Ausführung gestartet werden, [J]A oder [N]ein'
    	$DlgYES = New-Object System.Management.Automation.Host.ChoiceDescription '&Ja', 'Script starten'
    	$DlgNO = New-Object System.Management.Automation.Host.ChoiceDescription '&Nein', 'Script nicht starten!'
    	$options = [System.Management.Automation.Host.ChoiceDescription[]] ($DlgYES, $DlgNO)
    	$choice = $host.ui.PromptForChoice($title, $prompt, $options, 0)
    	
    	if ($choice -eq 1)
    	{ return 1}
    	else
    	{ Return 0}
    }
    
    $buttonGruppenVonQuelleZuZi_Click = {
    	$Uproof = get-userproofing
    	if ($Uproof -eq 0)
    	{ Write-Host "Start durch Anwender" }
    	else
    	{
    		Write-Host "Abbruch durch Anwender"
    		Return 1
    	}
    	$QuellDN = $QuellBenutzer.FetchedAttributes[1]
    	Write-Host $QuellDN
    	$ZielDN = $ZielBenutzer.FetchedAttributes[1]
    	$QuellBenutzerGruppen = Get-ADUser $QuellDN | Get-ADPrincipalGroupMembership
    	foreach ($QuellBenutzerGruppe in $QuellBenutzerGruppen)
    	{
    		Get-ADGroup $QuellBenutzerGruppe | Add-ADGroupMember -Members $ZielDN -ea 0
    	}
    	
    }
    
    $button2_Click = {
    	$Uproof = get-userproofing
    	if ($Uproof -eq 0)
    	{ Write-Host "Start durch Anwender" }
    	else
    	{
    		Write-Host "Abbruch durch Anwender"
    		Return 1
    	}
    	$QuellDN = $QuellBenutzer.FetchedAttributes[1]
    
    	Write-Host $QuellDN
    	$ZielDN = $ZielBenutzer.FetchedAttributes[1]
    	(Get-ADUser $ZielDN -properties memberof).memberof | Remove-ADGroupMember -Members $ZielDN -confirm:$false -ea 0
    	$QuellBenutzerGruppen = Get-ADUser $QuellDN | Get-ADPrincipalGroupMembership
    	foreach ($QuellBenutzerGruppe in $QuellBenutzerGruppen)
    	{
    		Get-ADGroup $QuellBenutzerGruppe | Add-ADGroupMember -Members $ZielDN -ea 0
    	}
    }

    ich habe das ganze in Notepad zusammen geschrieben, das musst Du kontrollieren. 

    lg klaus 


    Klaus

    • Als Antwort markiert Flash1976 Dienstag, 26. März 2019 10:39
    Dienstag, 26. März 2019 08:05
  • > Ist es auch möglich diese Abfrage vor das Fenster (siehe Screenshot) zu setzen?

    Sicher geht das. Man muß nur das Konsolen-Fenster in den Vordergrund holen: LINK .
    Aber wenn dein Script eine GUI hat, würde ich doch die Sicherheitsabfrage auch als UI-Dialogfenster realisieren:

    Function FnAreYouSure {    
        [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
        $mBox =  [Windows.Forms.MessageBox]::Show("Aktion durchführen?", "Achtung!", "YesNo","Exclamation", "Button2")
        
        if( $mBox -eq "YES" ) {return 1 }
        else {return 0 }
    }

     
    Das ist deutlich schöner und kein "Medienbruch".

    Grüße,Denniver


    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Donnerstag, 28. März 2019 14:48
    Moderator

Alle Antworten

  • hallo Andreas 

    ich denke mal das hier sollte Dir helfen 

    $title = 'Sicherheitsabfrage '
    $prompt = 'Soll die Ausführung gestartet werden, [J]A oder [N]ein'
    $DlgYES = New-Object System.Management.Automation.Host.ChoiceDescription '&Ja','Script starten'
    $DlgNO = New-Object System.Management.Automation.Host.ChoiceDescription '&Nein','Script nicht starten!'
    $options = [System.Management.Automation.Host.ChoiceDescription[]] ($DlgYES,$DlgNO)
    $choice = $host.ui.PromptForChoice($title,$prompt,$options,0)
    
    if ($choice -eq 1)
    {write-host "script wird nicht ausgeführt" -ForegroundColor Red
    exit 1}
    else 
    {write-host "script wird nun gestartet" -ForegroundColor Green}

    Please kindly test these workarounds in a testing or lab environment before deploying into production.

    | Please Mark This As Answer if it solved your issue |
    | Please Vote This As Helpful if it helps to solve your issue |
    | Disclaimer: This posting is provided with no warranties and confers no rights. |
    | N 48° 8' 39.8419" E 11° 36' 1.3359" |


    Klaus

    Montag, 25. März 2019 12:49
  • Hallo Klaus,

    vielen Dank.

    Ich werde im laufe des Tages mal versuchen den Teil in das bestehende Script einzuarbeiten.

    Grüße,

    Andreas


    • Bearbeitet Flash1976 Dienstag, 26. März 2019 06:31
    Dienstag, 26. März 2019 06:17
  • So wie ich mir das vorstelle klappt es leider nicht.

    Es geht darum diese beiden Funktionen (Kopieren / Ersetzen) durch eine Sicherheitsabfrage abfangen zu können oder zumindest eine Bestätigung zu erfragen:

    	$buttonGruppenVonQuelleZuZi_Click = {
    		$QuellDN = $QuellBenutzer.FetchedAttributes[1]
    		Write-Host $QuellDN
    		$ZielDN = $ZielBenutzer.FetchedAttributes[1]
    		$QuellBenutzerGruppen = Get-ADUser $QuellDN | Get-ADPrincipalGroupMembership
    		foreach ($QuellBenutzerGruppe in $QuellBenutzerGruppen)
    		{
    			Get-ADGroup $QuellBenutzerGruppe | Add-ADGroupMember -Members $ZielDN -ea 0
    		}
    		
    	}
    	
    	$button2_Click={
    		$QuellDN = $QuellBenutzer.FetchedAttributes[1]
    		Write-Host $QuellDN
    		$ZielDN = $ZielBenutzer.FetchedAttributes[1]
    		(Get-ADUser $ZielDN -properties memberof).memberof | Remove-ADGroupMember -Members $ZielDN -confirm:$false -ea 0
    		$QuellBenutzerGruppen = Get-ADUser $QuellDN | Get-ADPrincipalGroupMembership
    		foreach ($QuellBenutzerGruppe in $QuellBenutzerGruppen)
    		{
    			Get-ADGroup $QuellBenutzerGruppe | Add-ADGroupMember -Members $ZielDN -ea 0
    		}
    	}

    Ginge das in dem Fall nicht mit "-Confirm:$Y"?

    Dienstag, 26. März 2019 06:44
  • Hallo Flash, 

    der Parameter -Confirm ist für das entsprechende CmdLet und nicht für die Funktion.

    sprich, das hilft Dir nicht

    was Du machen kannst ist in der Click Funktion eine "Sicherheitsfunktion einzubauen"

    Function get-userproofing
    {
    	$title = 'Sicherheitsabfrage '
    	$prompt = 'Soll die Ausführung gestartet werden, [J]A oder [N]ein'
    	$DlgYES = New-Object System.Management.Automation.Host.ChoiceDescription '&Ja', 'Script starten'
    	$DlgNO = New-Object System.Management.Automation.Host.ChoiceDescription '&Nein', 'Script nicht starten!'
    	$options = [System.Management.Automation.Host.ChoiceDescription[]] ($DlgYES, $DlgNO)
    	$choice = $host.ui.PromptForChoice($title, $prompt, $options, 0)
    	
    	if ($choice -eq 1)
    	{ return 1}
    	else
    	{ Return 0}
    }
    
    $buttonGruppenVonQuelleZuZi_Click = {
    	$Uproof = get-userproofing
    	if ($Uproof -eq 0)
    	{ Write-Host "Start durch Anwender" }
    	else
    	{
    		Write-Host "Abbruch durch Anwender"
    		Return 1
    	}
    	$QuellDN = $QuellBenutzer.FetchedAttributes[1]
    	Write-Host $QuellDN
    	$ZielDN = $ZielBenutzer.FetchedAttributes[1]
    	$QuellBenutzerGruppen = Get-ADUser $QuellDN | Get-ADPrincipalGroupMembership
    	foreach ($QuellBenutzerGruppe in $QuellBenutzerGruppen)
    	{
    		Get-ADGroup $QuellBenutzerGruppe | Add-ADGroupMember -Members $ZielDN -ea 0
    	}
    	
    }
    
    $button2_Click = {
    	$Uproof = get-userproofing
    	if ($Uproof -eq 0)
    	{ Write-Host "Start durch Anwender" }
    	else
    	{
    		Write-Host "Abbruch durch Anwender"
    		Return 1
    	}
    	$QuellDN = $QuellBenutzer.FetchedAttributes[1]
    
    	Write-Host $QuellDN
    	$ZielDN = $ZielBenutzer.FetchedAttributes[1]
    	(Get-ADUser $ZielDN -properties memberof).memberof | Remove-ADGroupMember -Members $ZielDN -confirm:$false -ea 0
    	$QuellBenutzerGruppen = Get-ADUser $QuellDN | Get-ADPrincipalGroupMembership
    	foreach ($QuellBenutzerGruppe in $QuellBenutzerGruppen)
    	{
    		Get-ADGroup $QuellBenutzerGruppe | Add-ADGroupMember -Members $ZielDN -ea 0
    	}
    }

    ich habe das ganze in Notepad zusammen geschrieben, das musst Du kontrollieren. 

    lg klaus 


    Klaus

    • Als Antwort markiert Flash1976 Dienstag, 26. März 2019 10:39
    Dienstag, 26. März 2019 08:05
  • Hallo Klaus,

    die Funktion ist nun da nur leider hinter dem GUI :) Aber immherhin sochon etwas mehr Sicherheit. Ist es auch möglich diese Abfrage vor das Fenster (siehe Screenshot) zu setzen?

    Auf jeden Fall hat mich das schon einen großen Schritt weiter gebracht.

    Vielen Dank und Grüße,

    Andreas

    Dienstag, 26. März 2019 10:24
  • nein 

    der UI Teil also der Dialog den Du siehst ist in der Regel im Vodergrund. 

    was du aber machen kannst ist z.b. im Dialog einfach eine Checkbox einbauen und über die Kombination "Button Press" + Checkbox "True" arbeiten


    Klaus


    ich würde mich freuen wenn Du die Antwort als hilfreich markierst. ;-) 
    Dienstag, 26. März 2019 10:28
  • wenn Du nicht weiterkommst schick mir den Code mal ich schau mal ob ich das irgendwie mal zwischendurch machen kann 

    lg klaus


    Klaus

    Dienstag, 26. März 2019 10:52
  • Ich probier erst mal rum...

    Das Original-Script ist von der Webseite https://www.frankysweb.de/quick-and-dirty-active-directory-gruppen-von-benutzer-zu-benutzer-kopieren/

    Grüße und vielen Dank noch mal,

    Andreas

    Dienstag, 26. März 2019 11:37
  • > Ist es auch möglich diese Abfrage vor das Fenster (siehe Screenshot) zu setzen?

    Sicher geht das. Man muß nur das Konsolen-Fenster in den Vordergrund holen: LINK .
    Aber wenn dein Script eine GUI hat, würde ich doch die Sicherheitsabfrage auch als UI-Dialogfenster realisieren:

    Function FnAreYouSure {    
        [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
        $mBox =  [Windows.Forms.MessageBox]::Show("Aktion durchführen?", "Achtung!", "YesNo","Exclamation", "Button2")
        
        if( $mBox -eq "YES" ) {return 1 }
        else {return 0 }
    }

     
    Das ist deutlich schöner und kein "Medienbruch".

    Grüße,Denniver


    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Donnerstag, 28. März 2019 14:48
    Moderator
  • Sieht doch schön elegant aus :) Wie bekomme ich es am besten in das Script integriert?

    Grüße,

    Andreas

    Freitag, 29. März 2019 08:43
  • Den UI-Dialog oder die Methode zum Vorholen des Konsolenfensters?

    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.


    Freitag, 29. März 2019 09:48
    Moderator
  • Guten Morgen,

    sorry für die späte Antwort. Es geht nur darum die Sicherheitsabfrage vor dem auslösen der Kopier- bzw. Ersetzenfunktion zu zeigen. So wie es z.B. Klaus im Script, jedoch innerhalb der Powershell-Konsole, gesetzt hat. Hübscher wäre es wenn nach dem Klick auf Kopieren eine "Bist du sicher"-Box mit Ja/Nein gezeigt wird. Klaus seine Lösung funktioniert hier wunderbar. Wenn ich jedoch die Powershell mit "-windowstyle hidden" starte, dann gibt es ja keine Konsole in der ich die Sicherheitsabfrage bestätigen kann.

    $buttonGruppenVonQuelleZuZi_Click = {
    		$QuellDN = $QuellBenutzer.FetchedAttributes[1]
    		Write-Host $QuellDN
    		$ZielDN = $ZielBenutzer.FetchedAttributes[1]
    		$QuellBenutzerGruppen = Get-ADUser $QuellDN | Get-ADPrincipalGroupMembership
    		foreach ($QuellBenutzerGruppe in $QuellBenutzerGruppen)
    		{
    			Get-ADGroup $QuellBenutzerGruppe | Add-ADGroupMember -Members $ZielDN -ea 0
    		}
    		
    	}
    	
    	$button2_Click={
    		$QuellDN = $QuellBenutzer.FetchedAttributes[1]
    		Write-Host $QuellDN
    		$ZielDN = $ZielBenutzer.FetchedAttributes[1]
    		(Get-ADUser $ZielDN -properties memberof).memberof | Remove-ADGroupMember -Members $ZielDN -confirm:$false -ea 0
    		$QuellBenutzerGruppen = Get-ADUser $QuellDN | Get-ADPrincipalGroupMembership
    		foreach ($QuellBenutzerGruppe in $QuellBenutzerGruppen)
    		{
    			Get-ADGroup $QuellBenutzerGruppe | Add-ADGroupMember -Members $ZielDN -ea 0
    		}
    	}

    Danke und Grüße,

    Andreas

    Mittwoch, 3. April 2019 05:31
  • wenn du das Script mit -windowstyle startest kannst du einen Switch Parameter übergeben der einfach alles in der Console laufen lässt, wobei hier die Fragen wäre wenn sowie nicht sichtbar warum dann gui ?


    Klaus

    Mittwoch, 3. April 2019 06:26
  • Die UI-Funktion (FnAreYouSure) benutzt du einfach genau wie "get-userproofing". Hat nur (sinnvollere :) ) Rückgabewerte 1 = Ja , 0 = Nein .

     


    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Mittwoch, 3. April 2019 08:58
    Moderator
  • Guten  Morgen zusammen,

    vielen Dank noch mal für eure Hilfe. Ich hab allerdings jetzt ein Problem. Vielleicht ein Denkfehler im Script! Er führt die Aktion sowohl mit der Antwort "Ja" als auch mit der Antwort "Nein" durch. Es gibt also bei "Nein" keinen Abbruch des Kopiervorgangs.

    Function FnAreYouSure {    
        [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
        $mBox =  [Windows.Forms.MessageBox]::Show("Aktion durchführen?", "Achtung!", "YesNo","Exclamation", "Button2")
        
        if( $mBox -eq "YES" ) {return 1 }
        else {return 0 }
    }
    
    $buttonGruppenVonQuelleZuZi_Click = {
    	$Uproof = FnAreYouSure
    	if ($Uproof -eq 1)
    	{ Write-Host "Start durch Anwender" }
    	else
    	{
    		Write-Host "Abbruch durch Anwender"
    		Return 0
    	}
    	$QuellDN = $QuellBenutzer.FetchedAttributes[1]
    	Write-Host $QuellDN
    	$ZielDN = $ZielBenutzer.FetchedAttributes[1]
    	$QuellBenutzerGruppen = Get-ADUser $QuellDN | Get-ADPrincipalGroupMembership
    	foreach ($QuellBenutzerGruppe in $QuellBenutzerGruppen)
    	{
    		Get-ADGroup $QuellBenutzerGruppe | Add-ADGroupMember -Members $ZielDN -ea 0
    	}
    	
    }
    
    $button2_Click = {
    	$Uproof = FnAreYouSure
    	if ($Uproof -eq 1)
    	{ Write-Host "Start durch Anwender" }
    	else
    	{
    		Write-Host "Abbruch durch Anwender"
    		Return 0
    	}
    	$QuellDN = $QuellBenutzer.FetchedAttributes[1]
    
    	Write-Host $QuellDN
    	$ZielDN = $ZielBenutzer.FetchedAttributes[1]
    	(Get-ADUser $ZielDN -properties memberof).memberof | Remove-ADGroupMember -Members $ZielDN -confirm:$false -ea 0
    	$QuellBenutzerGruppen = Get-ADUser $QuellDN | Get-ADPrincipalGroupMembership
    	foreach ($QuellBenutzerGruppe in $QuellBenutzerGruppen)
    	{
    		Get-ADGroup $QuellBenutzerGruppe | Add-ADGroupMember -Members $ZielDN -ea 0
    	}
    }

    Wo hab ich mich da vertan?

    Grüße,

    Andreas



    • Bearbeitet Flash1976 Dienstag, 9. April 2019 06:43
    Dienstag, 9. April 2019 06:37
  • > Wo hab ich mich da vertan?

    Nicht bei dem Code den du hier gepostet hast, der funktioniert wie er soll. Hast du vielleicht bei der Zuweisung des Events zu den Buttons noch mehr hinein gepackt? Das sollte nur so z.B. aussehen:

    $button2.add_click($button2_Click)


    Ansonsten musst du einfach mal Schritt für Schritt durch dein Script gehen und rausfinden welcher Code genau fälschlich ausgeführt wird wenn du auf NEIN drückst (am einfachsten ein paar write-host zur Orientierung im Script verteilen) und von wo aus der Sprung dahin erfolgt.
     
    Es hilft hier sehr wenn man grundsätzlich Dinge wie die Kopierfunktion in eine echte Funktion packt. Dort kannst du dann nämlich ganz einfach am Anfang folgendes einbauen:

     Write-Host "Funktion wurde aufgerufen von Zeile: $($MyInvocation.scriptlinenumber)"

     
    und dir dadurch anzeigen lassen von welcher Zeile die Funktion aufgerufen wurde.
    Nebenbei ist es einfach auch besserer Stil. :)

    Grüße, Denniver


    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.


    Dienstag, 9. April 2019 09:04
    Moderator
  • @Klaus

    >einfach alles in der Console laufen lässt, wobei hier die Fragen wäre wenn sowie nicht sichtbar warum dann GUI

    Anders herum wird ein Schuh draus, Klaus: Es ist üblich, das wenn man mit PowerShell eine GUI benutzt, die Konsole zu verstecken. :-)
    Deine sonst sehr schöne Konsolenabfrage hat übrigens einen unschönen BUG: wenn man einfach versehentlich ENTER drückt ohne eine Auswahl getroffen zu haben, wird das als JA interpretiert.


    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Dienstag, 9. April 2019 09:23
    Moderator