none
Übertragen einer Variable in verschiedene Sessions RRS feed

  • Frage

  • Hallo community,

    ich hänge jetzt schon längere Zeit an folgendem Problem:

    Ich verbinde mich von einem PC mit einer PSsession auf einen anderen.

    Dort lese ich einen Registryschlüssel aus und speicher diesen in einer Variable.

    Jetzt möchte ich die Variable mit dem Wert aus der Remotesession in die lokale übertragen.

    Gibt es dafür eine Lösung?

    Zur veranschaulichung hier noch das bisherige Script:

    # Avoid displaying the UI prompt when creating credential object
    Set-ItemProperty 'HKLM:\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds' ConsolePrompting $true
    # The user name
    $username = "ASDF"
    # The domain
    $domain = ""
    # Complete user\domain string
    $UserDomain = $domain + "" + $username
    # The password (secure string)
    $secure_string_pwd = convertto-securestring "PASSWORD" -asplaintext -force
    # Create the powershell credential object
    $cred = new-object management.automation.pscredential $UserDomain,$secure_string_pwd 
    # Change the title of the powershell console
    (get-host).ui.rawui.windowtitle = $userName
    # Create the Powershell session (in this example I create a session to OcsPowerShell)
    $session = New-PSSession –Computername EIN-WINDOWS-PC -Credential $cred

    #Verbinden
    Enter-PSSession $Session

    #Auslesen
    $PRODUCTVERSION = Invoke-Command –scriptblock {Get-ItemProperty “hklm:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer” –Name Version} | Select-Object Version

    Dienstag, 4. März 2014 08:32

Antworten

  • Das Kommando Enter-PSSession ist hier FALSCH!

    #Verbinden
    Enter-PSSession $Session

    Enter-PSSession öffnet eine Interaktive PowerShell Sitzung.

    Enter-PSSession unterstüztzt auch NICHT die übergabe von Variablen oder Argumenten.

    Dafür musst du statt Enter-PSSession Invoke-Command benutzen.

    Benutze einfach das Cmdlet Invoke-Command mit der Sitzung als als Argument.

    Beispiel ungetestet:

    # Avoid displaying the UI prompt when creating credential object
    Set-ItemProperty 'HKLM:\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds' ConsolePrompting $true
    # The user name
    $username = "ASDF"
    # The domain
    $domain = ""
    # Complete user\domain string
    $UserDomain = $domain + "" + $username
    # The password (secure string)
    $secure_string_pwd = convertto-securestring "PASSWORD" -asplaintext -force
    # Create the powershell credential object
    $cred = new-object management.automation.pscredential $UserDomain,$secure_string_pwd 
    # Change the title of the powershell console
    (get-host).ui.rawui.windowtitle = $userName
    # Create the Powershell session (in this example I create a session to OcsPowerShell)
    $session = New-PSSession –Computername EIN-WINDOWS-PC -Credential $cred
    
    # Verbinden
    # FALSCH !! Enter-PSSession $Session
    
    #Auslesen
    $PRODUCTVERSION = Invoke-Command –scriptblock {param($RegistryKey) Get-ItemProperty $RegistryKey –Name Version} -Session $session -ArgumentList “hklm:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer”  | Select-Object Version

    Siehe Artikel hier:

    http://blogs.msdn.com/b/powershell/archive/2009/12/29/arguments-for-remote-commands.aspx


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Dienstag, 4. März 2014 12:05

Alle Antworten

  • Hallo,

    das sollte gehen, wenn du die letzen beiden Zeielen so zusammenfasst:

    $PRODUCTVERSION = Invoke-Command -Session $Session –scriptblock {Get-ItemProperty “hklm:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer” –Name Version} | Select-Object Version}

    Beste Gruesse
    brima


    • Bearbeitet brima Dienstag, 4. März 2014 10:22
    Dienstag, 4. März 2014 08:51
  • Funktioniert leider nicht, da die Variable $session nicht auf dem Remote-PC liegt, welcher über die PSsession angesprochen wird. Wenn ich lokal gespeicherte Variablen nutzen will, muss ich erst "exit" ausführen, dann kann ich wieder die lokal gespeicherten Variablen verwenden weil ich die Session verlassen habe.
    Dienstag, 4. März 2014 10:33
  • Das Kommando Enter-PSSession ist hier FALSCH!

    #Verbinden
    Enter-PSSession $Session

    Enter-PSSession öffnet eine Interaktive PowerShell Sitzung.

    Enter-PSSession unterstüztzt auch NICHT die übergabe von Variablen oder Argumenten.

    Dafür musst du statt Enter-PSSession Invoke-Command benutzen.

    Benutze einfach das Cmdlet Invoke-Command mit der Sitzung als als Argument.

    Beispiel ungetestet:

    # Avoid displaying the UI prompt when creating credential object
    Set-ItemProperty 'HKLM:\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds' ConsolePrompting $true
    # The user name
    $username = "ASDF"
    # The domain
    $domain = ""
    # Complete user\domain string
    $UserDomain = $domain + "" + $username
    # The password (secure string)
    $secure_string_pwd = convertto-securestring "PASSWORD" -asplaintext -force
    # Create the powershell credential object
    $cred = new-object management.automation.pscredential $UserDomain,$secure_string_pwd 
    # Change the title of the powershell console
    (get-host).ui.rawui.windowtitle = $userName
    # Create the Powershell session (in this example I create a session to OcsPowerShell)
    $session = New-PSSession –Computername EIN-WINDOWS-PC -Credential $cred
    
    # Verbinden
    # FALSCH !! Enter-PSSession $Session
    
    #Auslesen
    $PRODUCTVERSION = Invoke-Command –scriptblock {param($RegistryKey) Get-ItemProperty $RegistryKey –Name Version} -Session $session -ArgumentList “hklm:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer”  | Select-Object Version

    Siehe Artikel hier:

    http://blogs.msdn.com/b/powershell/archive/2009/12/29/arguments-for-remote-commands.aspx


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Dienstag, 4. März 2014 12:05
  • Vielen Dank für die schnelle Hilfe, hat wunderbar geklappt. Der Wert "Version" wird wie gewollt in die Variable $PRODUCTVERSION übertragen! :)

    Für alle die das finale Script als Copy/Paste Version haben wollen:

    # Avoid displaying the UI prompt when creating credential object
    Set-ItemProperty 'HKLM:\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds' ConsolePrompting $true
    # The user name
    $username = "Administrator"
    # The domain
    $domain = ""
    # Complete user\domain string
    $UserDomain = $domain + "" + $username
    # The password (secure string)
    $secure_string_pwd = convertto-securestring "Accenture2013" -asplaintext -force
    # Create the powershell credential object
    $cred = new-object management.automation.pscredential $UserDomain,$secure_string_pwd 
    # Change the title of the powershell console
    (get-host).ui.rawui.windowtitle = $userName
    # Create the Powershell session (in this example I create a session to OcsPowerShell)
    $session = New-PSSession –Computername WIN-T196P4SLT3K -Credential $cred
    
    
    #Auslesen+Schreiben in lokale Variable
    $PRODUCTVERSION = Invoke-Command –scriptblock {param($RegistryKey) Get-ItemProperty $RegistryKey –Name Version} -Session $Session -ArgumentList “hklm:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer”  | Select-Object Version

    Dienstag, 4. März 2014 14:01
  • Hallo,

    also die Var. $Session brauchst Du ja nicht auf dem Remotesystem.

    Durch die Verschmelzung der beiden Zeilen nutzt Invoke-Command die Session die $Session liefert um genau auf dem System die Info auszulesen und der lokalen Var. $PRODUCTVERSION zu zu weisen.

    In einer Loesung exitiert die Variable $PRODUCTVERSION  nur in der Remotesession.

    In Peters Loesung siehst du dann noch zusaetzlich, wie man 'Lokales' in die Remotesession bekommt.

    Beste Gruesse
    brima

    Dienstag, 4. März 2014 14:07