none
Exécution d'un script avec Invoke-Command ComputerName RRS feed

  • Question

  • Bonjour a tous

    ça fait un moment que je recherche comment faire une exécution d'un script powershell a distance mais sans réussite.

    voici ce que j'ai fait
    sur un serveur avec powershell 3

    Invoke-Command -ComputerName  MachineRemote -ScriptBlock { Start-Process Powershell -ArgumentList "-ExecutionPolicy Bypass -File C:\Path\Script.ps1" }

    Dans le script sur la machine "MachineRemote" il y a tout un tas de chose mais là ou ça coince c'est :

    Get-ChildItem \\serveur\d$\dossier -Recurse

    pourquoi quand j'exécute le script sur la machine ça fonctionne sans problème et dès que je l’exécute avec "Invoke-Command" depuis un serveur ça ne fonctionne plus ?

    le message retour que j'ai depuis le serveur

    [MachineRemote] Connecting to remote server MachineRemote failed with the following error

    message : A specified logon session does not exist. It may already

    have been terminated. For more information, see the about_Remote_Troubleshooting

    Help topic.    + CategoryInfo          : OpenError: (MachineRemote) [],

    PSRemotingTransportException    + FullyQualifiedErrorId : 1312,PSSessionStateBroken   

    + PSComputerName        : MachineRemote[MachineRemote] Connecting to remote server

    MachineRemote failed with the following error message : A specified logon session

    does not exist. It may already have been terminated. For more information, see the

    about_Remote_Troubleshooting Help topic.    + CategoryInfo          :

    OpenError: (MachineRemote) [], PSRemotingTransportException   

    + FullyQualifiedErrorId : 1312,PSSessionStateBroken   

    + PSComputerName        : MachineRemote




    • Modifié Troxsa vendredi 2 août 2019 07:02
    vendredi 2 août 2019 06:57

Réponses

Toutes les réponses

  • Bonjour,

    Partagez votre dossier intitulé "dossier", cela évitera de l'attaquer par le d$. 

    vendredi 2 août 2019 07:19
  • Bonjour,

    Pour faire simple, vous avez 3 machines dans votre contexte :

    • La machine initiatrice (I)
    • La machine qui exécute le script Powershell (E)
    • La machine que vous tentez d'interroger (\\serveur -- à moins que ce soit la même que la précédente?) (A)

    La machine I se connecte avec les informations d'identification en cours à la machine E.

    Le script exécuté sur la machine E tente donc de lire la machine A avec les mêmes éléments d'identification de I : est-ce que les éléments d'identification valides sur I le sont aussi sur A ?

    D'après l'erreur "A specified logon session does not exist", il n'existe pas de session valide entre E et A : vous devez initier une authentification entre E et A


    Cordialement,

    Sylvain (MCP, MCTS Windows Server 2008 R2 Server Virtualization, MCTS Exchange 2010)

    Blog : http://sylvaincoudeville.fr

    vendredi 2 août 2019 07:28
  • Bonjour,

    Partagez votre dossier intitulé "dossier", cela évitera de l'attaquer par le d$. 

    Effectivement j'ai pensé a faire cela, si j'ai pas d'autre possibilités je ferais les tests avec un mappage 

    Cordialement,

    vendredi 2 août 2019 09:39
  • Bonjour,

    Pour faire simple, vous avez 3 machines dans votre contexte :

    • La machine initiatrice (I)
    • La machine qui exécute le script Powershell (E)
    • La machine que vous tentez d'interroger (\\serveur -- à moins que ce soit la même que la précédente?) (A)

    La machine I se connecte avec les informations d'identification en cours à la machine E.

    Le script exécuté sur la machine E tente donc de lire la machine A avec les mêmes éléments d'identification de I : est-ce que les éléments d'identification valides sur I le sont aussi sur A ?

    D'après l'erreur "A specified logon session does not exist", il n'existe pas de session valide entre E et A : vous devez initier une authentification entre E et A


    Cordialement,

    Sylvain (MCP, MCTS Windows Server 2008 R2 Server Virtualization, MCTS Exchange 2010)

    Blog : http://sylvaincoudeville.fr

    Effectivement, je suis sur un serveur (avec des droits administrateur domaine) ou je tente d’exécuter un script powershell qui se trouve sur une workstation en Windows 7 qui interroge un autre serveur du domaine (qui est bien différant du premier). (serveur 1, workstation 1, serveur 2)

    D'après ce que je comprends dans vos explications c'est qu'il n'y a pas d'héritage de droit entre la workstation 1 et le serveur 2 ?

    Il me semblait que l’héritage de droit admin était automatique ...

    Donc il faut rajouté une authentification avec Get-Credential du serveur 1 qui exécute le script sur la workstation 1 ? (il me semble avoir fait des tests avec Get-Credential et ça ne fonctionne pas plus, peut être que je me suis mal pris ?)


    Cordialement,

    vendredi 2 août 2019 09:54
  • Je viens de tester ceci 

    $CredentialsInSession = Get-Credential -UserName dom\loginadm -Message "test"

    Invoke-Command -computername ************.fr -ScriptBlock { Start-Process -FilePath "Powershell.exe" -ArgumentList "-File C:\temp\test.ps1" -Credential $args} -ArgumentList $CredentialsInSession


    ça ne fonctionne pas
    Une idée ?


    Cordialement,

    vendredi 2 août 2019 11:53
  • Le problème de contexte de sécurité est entre la machine E et A. C'est donc dans le script PowerShell que l'authentification doit avoir lieu entre la machine E et A.

    Je pensais donc à un code du genre :

    New-PSDrive -Name target -PSProvider FileSystem -Credential $cred -Root "\\serveur\share\folder" | Out-Null

    à lancer avant le Get-ChildItem, afin que le contexte powershell de la machine E soit connecté à la ressource A.


    Cordialement,

    Sylvain (MCP, MCTS Windows Server 2008 R2 Server Virtualization, MCTS Exchange 2010)

    Blog : http://sylvaincoudeville.fr

    vendredi 2 août 2019 12:41
  • Je copie  le code, j'ai mis entre {} des autres noms pour cacher les informations lier a la société

    J'ai aussi retirer les authentifications de $cred

    $resultat = nslookup {dfsName}
    $test = $resultat | ? {$_ -match "Name|Nom"}
    $serveur = $test.Split(":")[1].trim() 
    Write-Log -Message "Le serveur est : $serveur " -Level Info
    Write-Log -Message "Début - Récupération des fichiers et des variables d'environnement" -Level Info
    
    New-PSDrive -Name test -PSProvider FileSystem -Credential $cred -Root "\\$serveur\d$" | Out-Null
    
    $GetFileSourcesServer = Invoke-Command -ComputerName $serveur -ScriptBlock { Get-ChildItem "$env:{xxxx\xxxx}" -Recurse -File}
    $GetVariablesServer = Invoke-Command  -ComputerName $serveur -ScriptBlock { Get-ChildItem env:{valeur}}

    Le code ne fonctionne pas avec New-PSDrive

    Si je fais un mappage reseau avec "net use" sur un lecteur ça fonctionne. mais la question est comment faire pour ne pas laisser un login et mot de passe en claire dans le ps1 ?

    si je met dans le script des params pour credential ça pourrait fonctionner ?


    Cordialement,

    vendredi 2 août 2019 13:24
  • Avec le code, c'est dessuite beaucoup plus clair! 

    Alors 2 choses :

    • Le changement de contexte a lieu dès l'exécution de Invoke-Command. Du coup, c'est dans le bloc de commandes que l'authentification doit avoir lieu !
    • Les variables à l'intérieur du scriptblock sont locales : du coup, $env:{xxxx\xxxx} ne sera pas récupéré de l'appelant

    Pour transmettre les identifications, le plus simple serait de passer par une session :


    $session = New-PSSession -Credentials $cred

    $GetFileSourcesServer = Invoke-Command -Session $session -ComputerName $serveur -ScriptBlock { Get-ChildItem "$env:{xxxx\xxxx}" -Recurse -File} $GetVariablesServer = Invoke-Command  -Session $session ComputerName $serveur -ScriptBlock { Get-ChildItem env:{valeur}}


    Cordialement,

    Sylvain (MCP, MCTS Windows Server 2008 R2 Server Virtualization, MCTS Exchange 2010)

    Blog : http://sylvaincoudeville.fr

    vendredi 2 août 2019 13:43
  • pour info Troxsa tu te trouve dans la situation du double saut 

    voir ce site ou ici en anglais pour les solutions


    • Modifié 6ratgus vendredi 2 août 2019 15:07
    • Marqué comme réponse Troxsa mercredi 7 août 2019 09:32
    vendredi 2 août 2019 15:07
  • pour info Troxsa tu te trouve dans la situation du double saut 

    voir ce site ou ici en anglais pour les solutions


    Merci 6ratgus les liens que vous avez donné ressemble beaucoup au problème que j'ai.

    Je suis de retour au boulot, je vais lire et applique au mieux, si j'ai un problème je reviendrais ;)


    Cordialement,

    lundi 5 août 2019 06:22