IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Déclarer une fonction locale dans une remote session


Sujet :

Scripts/Batch

  1. #1
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut Déclarer une fonction locale dans une remote session
    Bonjour,

    Je cherche à faire en sorte qu'une fonction déclarée dans un script et ouvrant une remote session puisse être connue dans cette même remote-session sans avoir à faire d'import local d'un module.
    Autant, je trouve facilement comment passer une variable. Ca c'est OK.
    Autant, pour les fonctions je trouve des bouts de codes incomplets et que je n'arrive pas à adapter à mon cas.

    Je souhaite pouvoir appeler la fonction et utiliser la fonction Write-Log dans le ScriptBlock executé dans la remote-session.

    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    $log_dir      = $env:USERPROFILE + '\Desktop\'
    $log_name     = 'Remote-idm_log.csv'
    $log_FullName = $log_dir + $log_name
     
    Function Write-Log
    {
        Param
        (
            [Parameter(Mandatory=$False)][ValidateSet("INFO","WARN","ERROR","FATAL","DEBUG","JOB")][String]$level = "INFO",
            [Parameter(Mandatory=$True)][string]$data,
            [Parameter(Mandatory=$True)][string]$logfile
        )
     
        $stamp = (Get-Date).toString("dd/MM/yyyy;HH:mm:ss")
        $data = "$stamp;$Level;$data"
     
        if ( $data ) { Write-Host $data }
        If ( !( Test-Path $log ) ) 
        {
            New-Item -Path $log_dir -Name $log_name -ItemType "file" | Out-Null
        }
        else 
        { 
            if   ( $data ) { Add-Content $logfile -Value $data } 
            else           { Add-Content $logfile -Value "$stamp;$Level;NODATA" }
        }
    }
     
    $WriteLog_Remote = Get-Item 'Function:\Write-Log'
     
    $url_file = $env:TMP + '\url.txt'
    Start-Process notepad.exe -ArgumentList $url_file -Wait
    $link_list = Get-Content $url_file
     
     
    foreach ( $link in $link_list )
    {
        if ( $link )
        {
            $PSSession_id = New-PSSession -ComputerName 'NAS' 
     
            Invoke-Command -Session $PSSession_id -ScriptBlock { 
                param( $link, $WriteLog_Remote, $logFile )
                [ScriptBlock]::Create($using:WriteLog_remote)
                $arguments = '/s' + ' /d ' + $using:link + ' /p E:\DOWNLOAD\ /n /q'
                Write-Host Downloading $using:link -ForegroundColor Green
                &$using:WriteLog_Remote -level 'INFO' -data $using:link -logfile $using:logFile 
                $process = Start-Process IDMan.exe -ArgumentList $arguments -NoNewWindow -PassThru
                $process.WaitForExit()
                } -ArgumentList $link, $WriteLog_Remote, $log_FullName
            Remove-PSSession $PSSession_id
        }
    }

    Je vous remercie par avance pour vos lumières car clairement j'avance à tâtons sans trop comprendre ce qu'il se passe et ça m'agace :p
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Essai ceci
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    Invoke-Command -computerName $remoteHostname -Credential $cred -ScriptBlock ${function:Add-Title } -argumentlist "Spolsky"

    Une autre solution sur le lien
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Import-Module .\Common.ps1 -Force
    # Now you can call common functions locally
     
    $commonFunctions = (Get-Command .\Common.ps1).ScriptContents
    Invoke-Command -Session $session -ArgumentList $commonFunctions -ScriptBlock {
        param($commonFunctions)
        Invoke-Expression $commonFunctions
     
        # Now you can call common functions on the remote computer
    }

  3. #3
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Merci pour ton retour,

    #Un fan de Joë!

    Après quelques modifications du script pour m’adapter et tant mieux c'était nécessaire, ( Y'avait des absurdités et y'en a sûrement toujours ) mais je suis parvenu à mes fins grâce à ta réponse.
    Néanmoins, est-ce possible d'éviter l'import du module tout en parvenant au même résultat en ayant la fonction Write-Log définie directement dans le fichier script appelant ?

    Write-Log.ps1
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Function Write-Log
    {
        Param
        (
            [Parameter(Mandatory=$False)][ValidateSet("INFO","WARN","ERROR","FATAL","DEBUG","JOB")][String]$level = "INFO",
            [Parameter(Mandatory=$True)][string]$data,
            [Parameter(Mandatory=$True)][string]$logfile
        )
     
        if ( $logfile )
        {
            Write-Host Logging into $logfile  
            $b = $False
            If ( !( $b = ( Test-Path -Path $logfile ) ) ) 
            {
                New-Item -Path $logfile -ItemType "file" | Out-Null
                $b        = $True
            }
     
            if( $b )
            { 
                $stamp = (Get-Date).toString("dd/MM/yyyy;HH:mm:ss")
                if   ( $data ) { Add-Content $logfile -Value "$stamp;$Level;$data"  ; Write-Host "$stamp;$Level;$data" } 
                else           { Add-Content $logfile -Value "$stamp;$Level;NODATA"                                    }
            }
        }
        else { Write-Host logfile is null }
    }

    Script appelant

    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Import-Module $( $env:USERPROFILE + '\Documents\POWERSHELL\Write-Log.ps1' ) -Force
     
    $WriteLog_Remote = (Get-Command C:\Users\IDIOT\Documents\POWERSHELL\Write-Log.ps1).ScriptContents
     
    $url_file = $env:TMP + '\url.txt'
    Start-Process notepad.exe -ArgumentList $url_file -Wait
    $link_list = Get-Content $url_file
     
    $PSSession_id = New-PSSession -ComputerName 192.168.1.44
    foreach ( $link in $link_list )
    {
        if ( $link )
        {
            Invoke-Command -Session $PSSession_id -ScriptBlock { 
                param( $link, $WriteLog_Remote, $log_FullName )
                Invoke-Expression $WriteLog_Remote    
     
                Write-Host Downloading $link -ForegroundColor Green
                Write-Log -level 'INFO' -data $link -logfile $($env:USERPROFILE + '\Desktop\idm_log.csv')
     
                $arguments = '/s' + ' /d ' + $link + ' /p E:\DOWNLOAD\ /n /q'
                $process   = Start-Process IDMan.exe -ArgumentList $arguments -NoNewWindow -PassThru
                $process.WaitForExit()
     
                } -ArgumentList $link, $WriteLog_Remote, $log_FullName
        }
    }
    Remove-PSSession $PSSession_id
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 184
    Points : 5 755
    Points
    5 755
    Par défaut
    J'ai oublié le lien en fait
    https://serverfault.com/questions/45...rshell-session

    Néanmoins, est-ce possible d'éviter l'import du module tout en parvenant au même résultat en ayant la fonction Write-Log définie directement dans le fichier script appelant ?
    Je ne sais pas, je te laisse faire le test

Discussions similaires

  1. où déclarer une fonction utilisée dans toutes mes jsp ?
    Par aurelientp dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 22/02/2008, 10h38
  2. Réponses: 2
    Dernier message: 31/12/2007, 13h50
  3. Réponses: 2
    Dernier message: 08/04/2007, 22h24
  4. déclarer une table dans une fonction SQL
    Par bicho dans le forum VB.NET
    Réponses: 3
    Dernier message: 19/03/2007, 14h11
  5. Déclarer une fonction ayant 2 prototypes dans une DLL
    Par Jayceblaster dans le forum Delphi
    Réponses: 8
    Dernier message: 17/02/2007, 12h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo