none
Skript per Kontextmenu-Eintrag "Mit Powershell ausführen" starten, klappt nicht RRS feed

  • Frage

  • Hallo Zusammen,

    ich möchte mittels einem PS Skript, Beispielhaft hier, einen AD Benutzer auswählen und entsprechende Informationen exportieren/öffnen.
    Hierzu habe eine PS-Skript mit Funktion erstellt, mit verpflichtenden Parameter, was auch soweit funktioniert (ISE F5/F8) oder als PS-Verknüpfung.

    Verständnis Frage:
    Ich möchte das Script nun “Mit Powershell ausführen” und dabei soll, wenn nicht erfolgt, die benötigen Eingabewerte abgefragt werden.
    Führe ich das Script aus, so schließt es sich direkt wieder…

    Geht dies überhaupt (so wie mit der F5 ausführen Funktion der ISE) oder muss hier mit ReadHost (vermutlich in der PARAM Sektion) gearbeitet werden?

    CODE:
    #
    <#
    .SYNOPSIS
        SELECT a user object from the AD (ACTIVE DIRECTORY)
    
    .DESCRIPTION
        SELECT a user ocject from the AD and export some attribute information:
    
    .NOTES
         Script Name     : SELECT-ADUser
         Description     : SELECT AD User Account
         
         Version         : 1.0
    
    .REQUIREMENT
        PowerShell Version
            - Version 4
                "(get-host).version.major" or "$PSVersionTable.PSVersion"
    
        PowerShell Module
            - ActiveDirectory
                "Import-Module ActiveDirectory"
    
        PowerShell PSSnapin
            - None
    
        PowerShell Extensions
            - None
        
        PowerShell Assembly
            - None
        
        Script Rights
            - The account running the script needs
                RO access to global AD users
    
    .PARAMETER
        - ExportPath "Required Parameter. Example is 'C:\PS\Reports\' Folder"
    
    .EXAMPLE
    
        - Start script to select AD User Object "m.mustermann" and save the output CSV file to C:\PS\Reports\
            .\SELECT-ADUser -Account "m.mustermann" -ExportPath "C:\PS\Reports\"
    
    .SOURCE
        None
    
    .TEST OPTION
        NONE
    #
    #>                                                   # SYNOPSIS BLOCK
    #
    [cmdletbinding()]
    PARAM (
            [Parameter(Mandatory=$True,
                ValueFromPipeline=$True,
                ValueFromPipelineByPropertyName=$True,
                HelpMessage="ENTER: 'AD User SamAccountName' like 'm.mustermann'")]
                [ValidateNotNullOrEmpty()]
                [String] $Account,
    
            [Parameter(Mandatory=$True,
                ValueFromPipeline=$True,
                ValueFromPipelineByPropertyName=$True,
                HelpMessage="ENTER: ExportPath for CSV files like 'C:\PS\Reports\'")]
                [ValidateNotNullOrEmpty()]
                [String] $ExportPath
                )                       # PARAMETER BLOCK
    #
    BEGIN {
    #
    #----------------------------------------------------------
    # ERROR HANDLING
    #----------------------------------------------------------
    #
    # /* ERROR REPORTING ALL */
    Set-StrictMode -Version latest
    #
    # /* ERROR Action */
    $ErrorActionPreference       = "SilentlyContinue"
    #
    #----------------------------------------------------------
    # FUNCTIONS DECLARATION
    #----------------------------------------------------------
    Function Load-ActiveDirectoryModuleLocal {
        Write-Host "LOAD`t`t'PS Module 'ActiveDirectory''" -ForegroundColor Yellow -nonewline
        IF (!(Get-Module ActiveDirectory -ErrorAction $ErrorActionPreference)) {
                Try {
                    Import-Module ActiveDirectory
                    }
                Catch {
                    Write-Host "`t" -NoNewline
                    Write-Warning  "EXIT: 'LOAD Module 'ActiveDirectory' not possible!'"
    		        Sleep 3
                    Exit 0
                    }
                Finally {
                    IF (Get-Module ActiveDirectory -ErrorAction $ErrorActionPreference) { Write-Host "`t`tOK`tLOAD" -ForegroundColor Green}
                    }
            }
        ELSE {
            Write-Host "`t`tOK`t'Module already loaded'!" -foregroundcolor Green
    
        }    
    }            # END Function Load-ActiveDirectoryModuleLocal
    #
    Function Get-ADCloseGC {
        #Get this computer's AD site using .NET
        $mySite = [System.DirectoryServices.ActiveDirectory.ActiveDirectorySite]::GetComputerSite()
        #Get the DNS Root domain
        $ADRoot = $(Get-AdDomain).DNSRoot
        #Get enabled DCs which are GCs in MySite
        [array]$DomainGCs = Get-ADDomainController -server $ADRoot `
         -Filter {(Enabled -eq $true) -and (IsGlobalCatalog -eq $true)}
        #Get GCs for this computer's AD site
        [array]$MyGCs = $DomainGCs | Where-Object {$_.Site -eq $mySite}
        #Get GC for mySite, if none available, pick first returned from DomainGCs
        IF ($MyGCs -ne $null) {
            Return $MyGCs[0].HostName
            }
        ELSE {
            Return $DomainGCs[0].HostName
            }
    }                              # END Function Get-ADCloseGC
    #
    #----------------------------------------------------------
    # GLOBAL SCRIPT VARIABLES
    #----------------------------------------------------------
    #
    $PSScriptVersion             = "v1.0"
    $ReportName                  = "SELECT-ADUser"
    }
    #
    PROCESS {
        #
        # /* Clear Screen*/
        Clear-Host
        #
        Write-Host -ForegroundColor Yellow "-------------------------------------------------------------------------------------------"
        Write-Host -ForegroundColor Yellow "START:`t<>`tSCRIPT`t:: '$ReportName' Version '$PSScriptVersion'"
        Write-Host -ForegroundColor Yellow "-------------------------------------------------------------------------------------------"
        #
        #----------------------------------------------------------
        # Load Modules
        #----------------------------------------------------------
    	#
        # /* LOAD Modules */
        Load-ActiveDirectoryModuleLocal
    	#
        #----------------------------------------------------------
        # SCRIPT VARIABLES
        #----------------------------------------------------------
        #
        $ADCloseGC                   = Get-ADCloseGC
        #
        $efile                       = "$($ExportPath )$($ExportFileName).csv"
        #----------------------------------------------------------
        # SCRIPT SEQUENCE
        #----------------------------------------------------------
        #
        # /* CHECK if username exists */
        $UserCheck               = $(Try {Get-ADUser -Identity $Account -Server $ADCloseGC} Catch {$null})
        If (!$UserCheck) {
        Write-Host -ForegroundColor Red    "CHECK:`t<>`tERROR`t:: SamAccountName not found '$($Account)'"
        Sleep 3
        Exit 0
        }
        ELSE {
        Write-Host -ForegroundColor Green  "CHECK:`t<>`tOK`t`t:: SamAccountName found '$($Account)'"
        }
        #
        # /* GET AD User Object Attributes and Information */
        #
        #----------------------------------------------------------
        # GET Active Directory Information
        #----------------------------------------------------------
        #
        $ADUser                  = Get-ADUser -Identity $Account -Property * -Server $ADCloseGC | Sort-Object
        #
        #----------------------------------------------------------
        # REPORT Section
        #----------------------------------------------------------
        #
        $Result           = @()
        $Object                  = New-Object PSObject
            Add-Member -InputObject $Object -memberType NoteProperty -Name DisplayName        -Value $ADUser.'DisplayName'
            Add-Member -InputObject $Object -memberType NoteProperty -Name SamAccountName     -Value $ADUser.'SamAccountName'
            Add-Member -InputObject $Object -memberType NoteProperty -Name SID                -Value $ADUser.'objectSID'.Value
        $Result += $Object
        #
       }
    #
    END {
        #----------------------------------------------------------
        # Export CSV
        #----------------------------------------------------------
        Write-Host "EXPORT:`t`t'Results to CSV-File'" -ForegroundColor Yellow -nonewline
        #
        $Result                 | Export-Csv -Path $efile -Delimiter ";" -Encoding UTF8 -NoTypeInformation -ErrorAction $ErrorActionPreference
        & $efile
        #
        IF ($?) {
            Write-Host "`t`t`t`tOK" -Foreground Green
            }
        ELSE {
            Write-Host ""
            Write-Warning "`tERROR in Section 'CSV File Export'"
            }            
        #
        Exit 0
        }
    #

    Vielen Dank im Voraus für jede Art der Zusammenarbeit.


    Manfred Schüler


    Mittwoch, 14. Oktober 2015 07:16

Antworten

  • Ich denke wir müssen mal schauen, ob da nicht eine Fehlermeldung in der aufpoppenden Konsole auftaucht.

    Geh mal mit Regedit zu:

    HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\0\Command
     

    Da sollte ein einzelner Standard-key drinstehen mit einem Powershell-Aufruf als Wert. (Falls nicht hast du das Problem bereits gefunden. :) )

    Füge dort mal zwischen ".....powershell.exe" und "-command......" noch

    "-noexit"

    ein. (mit den Anführungszeichen!) Danach sollte die Konsole in jedem Fall offen bleiben.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    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, 20. Oktober 2015 12:39
    Moderator
  • Der Standardeintrag ist:
     
    "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'"


    Grüße, Denniver

    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    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, 21. Oktober 2015 12:02
    Moderator

Alle Antworten

  • Durch das Mandatory=$true beim jeweiligen Parameter wird dieser entsprechend bei der Ausführung abgefragt, falls er nicht angeben wird. Wenn ich dein Skript abspeichere und per Rechtsklick -> Mit Powershell ausführen starte, werde ich auch entsprechend nach Account und ExportPath gefragt.

    Gruß,

    Olaf



    • Bearbeitet Olaf Reitz Mittwoch, 14. Oktober 2015 07:35
    Mittwoch, 14. Oktober 2015 07:34
  • Hallo Olaf,

    Danke für deine Antwort.

    Da ich im Skript ja Mandatory=$true ja gesetzt habe, war ich auch davon ausgegangen.

    Lege ich das Skript zum Beispiel auf dem Desktop ab und wähle wie du per Rechtsklick -> Mit Powershell ausführen dann kommt keine Nachfrage zum Parameter und die Shell schließt sofort wieder!?

    Öffne ich die PS Konsole und ziehe das Script hinein und führe es mit der Dot Sourcing Methode aus,

    PS C:\Windows\System32\WindowsPowerShell\v1.0> . "C:\Users\username\Desktop\script.ps1"

    erfolgt, genauso wie mit der ISE, die Abfrage der Parameter :-) ! 

    Und du führst es nur mit "Mit Powershell ausführen" aus?

    Ich kann manchmal einen Fehler im Hintergrund erkennen, aber die Shell schließt zu schnell und mit dem Parameter -NoExit erhalte ich auch keinen Hinweis darauf warum.


    Manfred Schüler

    Mittwoch, 14. Oktober 2015 10:00
  • Jep, nur mit "Mit Powershell ausführen".
    Mittwoch, 14. Oktober 2015 12:09
  • Verrückt und verstehe ich nicht!? :-(


    Manfred Schüler

    Mittwoch, 14. Oktober 2015 13:16
  • Also mit "Rechtsklick -> Mit Powershell ausführen" erfolgt keine Abfrage der Parameter, nur wenn ich eine "Verknüpfung" anlege und diese ausführe wie folgt:

    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoExit –ExecutionPolicy Unrestricted –NoProfile –File "C:\Users\username\Desktop\new0.ps1"
    Hatte den Verdacht der Zustand könnte wie hier beschrieben Unexpected attribute ‘cmdletbinding’ auftreten, was aber nicht der Fall war.



    Manfred Schüler



    • Bearbeitet MSchueler Mittwoch, 14. Oktober 2015 15:26
    Mittwoch, 14. Oktober 2015 15:19
  • Das sollte genau so gehen.
    Sicher das die Execution-Policy auf der ausführenden Maschine richtig gesetzt ist?
     
    PoSh Konsole ->
    Get-Executionpolicy -list
     
    Grüße, Denniver

    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    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, 15. Oktober 2015 13:11
    Moderator
  • Hallo Denniver,

    ich verstehe es nicht!

    Habe das Script etwas verkleinert, jedoch das Verhalten bleibt!?

    HelloWorld.ps1

    [cmdletbinding()]
    PARAM (
            [Parameter(Mandatory=$True,
                HelpMessage="ENTER: 'Date' like '-Format yyyy-MM-dd'")]
                [ValidateNotNullOrEmpty()]
    			[String] $Date,
    
            [Parameter(Mandatory=$True,
                HelpMessage="ENTER: 'Time' like '-Format HH:mm'")]
                [ValidateNotNullOrEmpty()]
    			[String] $Time
                )                       # PARAMETER BLOCK
    #
    Write-Output ""
    Write-Output "Hello World"
    Write-Output "[Date] $Date"
    Write-Output "[Time] $Time"
    Sleep 10


    .... Folgendes habe ich geprüft bzw. sogar geändert:

    PS C:\> get-ExecutionPolicy -list
    
                                                                                       Scope                                                                         ExecutionPolicy
                                                                                       -----                                                                         ---------------
                                                                               MachinePolicy                                                                               Undefined
                                                                                  UserPolicy                                                                               Undefined
                                                                                     Process                                                                               Undefined
                                                                                 CurrentUser                                                                            Unrestricted
                                                                                LocalMachine                                                                            Unrestricted


    Interessant ist, führe ich das Script mit "Powershell ausführen" auf meinem Recher mit Windows 7 Pro mit PowerShell Version 4 aus, auch mit anderen Benutzerprofilen, schließt sich das Fenster direkt wieder.

    Lege ich eine Verknüpfung dazu an und führe diese aus, dann klappt es:

    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoExit –File "C:\Users\User\Desktop\HelloWorld.ps1"

    Führe ich das Script auf anderen Rechner aus Windows 7 mit PSVersion 2, Windows 8.1 mit PSVersion 4 oder Windows Server2012 R2 PSVersion 4, verhält sich das Script "mit PS ausführen" wie von dir beschrieben und von mir gewünscht!!!

    Also liegt das Problem an meinem Host.

    Die Frage ist nur Warum und kann ich die PS-Einstellungen zurücksetzen?


    Manfred Schüler

    Montag, 19. Oktober 2015 10:04
  • Ich denke wir müssen mal schauen, ob da nicht eine Fehlermeldung in der aufpoppenden Konsole auftaucht.

    Geh mal mit Regedit zu:

    HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\0\Command
     

    Da sollte ein einzelner Standard-key drinstehen mit einem Powershell-Aufruf als Wert. (Falls nicht hast du das Problem bereits gefunden. :) )

    Füge dort mal zwischen ".....powershell.exe" und "-command......" noch

    "-noexit"

    ein. (mit den Anführungszeichen!) Danach sollte die Konsole in jedem Fall offen bleiben.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    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, 20. Oktober 2015 12:39
    Moderator
  • Hi Denniver,

    der Eintrag im Pfad,

    [HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\0\Command]

    ist vorhanden

    "C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe" "-file" "%1" "-Command" "if((Get-ExecutionPolicy ) -ne AllSigned) { Set-ExecutionPolicy -Scope Process Bypass }"

    und wurde geändert in,

    "C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe" "-noexit" "-file" "%1" "-Command" "if((Get-ExecutionPolicy ) -ne AllSigned) { Set-ExecutionPolicy -Scope Process Bypass }"

    Nun bliebt beim ausführen das Fenster offen, mit der Fehlermeldung 

    Windows PowerShell
    Copyright (C) 2013 Microsoft Corporation. Alle Rechte vorbehalten.
    
    C:\Users\username\Desktop\HelloWorld.ps1 : Es wurde kein Parameter gefunden, der dem Parameternamen "Command" entspricht.
        + CategoryInfo          : InvalidArgument: (:) [HelloWorld.ps1], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : NamedParameterNotFound,HelloWorld.ps1
    
    PS C:\Users\username\Desktop>

    Was hier das Problem ist, verstehe ich nicht ... noch nicht hoffentlich!

    Normaler Aufruf wäre ja:

    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -noexit -Command "& 'C:\Users\Username\Desktop\HelloWorld.ps1'"

    Was auch als Verknüpfung oder direkten "Ausführen" (Windows Taste + R") einwandfrei funktioniert.

    Was ist denn der Standard Ausdruck in diesem RegKey?

    Ändere ich das Script wie folgt in HelloWorld2.ps1 ab, ist ein "mit PS Ausführen" auch erfolgreich möglich!?

    $Date = Read-host "Enter 'Date'"
    $Time = Read-host "Enter 'Time'"
    #
    Write-Output ""
    Write-Output "Hello World"
    Write-Output "[Date] $Date"
    Write-Output "[Time] $Time"
    Sleep 10



    Manfred Schüler

    Mittwoch, 21. Oktober 2015 06:16
  • Habe nun den RegKey auf den Wert 

    "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -noLogo -ExecutionPolicy Bypass -file "%1"

    gesetzt und tata ... Klappt :-)

    DANKE allen


    Manfred Schüler

    Mittwoch, 21. Oktober 2015 06:45
  • Der Standardeintrag ist:
     
    "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'"


    Grüße, Denniver

    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    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, 21. Oktober 2015 12:02
    Moderator
  • Bitte markiere deine Antwort nicht mehr. Antwortmarkierungen sind als Orientierungshilfe für nachfolgende User gedacht.

    Die von die gepostete Zeile mag ja für dich ein sinvoller Eintrag sein, aber es ist nicht Standard. Jemand der ein ähnliches Problem hat, sollte eher den Standard wiederherstellen als zu denken deine für dich angepasste Kommandozeile sei die richtige.

    Punkte gibt es eh keine, wenn du eine eigene Antwort markierst, sorry.


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v4: Link ! Neue Version !
    (Schneller, besser + komfortabler scripten.)

    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, 22. Oktober 2015 13:34
    Moderator