2016-09-10 4 views
1

Je suis aux prises avec invoke-Command pour exécuter une fonction personnalisée à distance et afficher la sortie sur l'hôte local. J'ai lu beaucoup de messages concernant invoke-Command en ligne mais je n'ai pas trouvé un moyen de résoudre ce problème.Powershell: utiliser la commande invoke avec une fonction personnalisée pour exécuter sur l'ordinateur distant et la sortie d'affichage sur l'ordinateur hôte

D'abord, la fonction personnalisée fonctionne. Ça s'appelle get-openfiles. Le code est fourni ci-dessous:

function get-openfiles{                     
param(                         
[email protected]($env:computername),                  
$verbose=$false)                       
$collection = @()                       
foreach ($computer in $computername){                  
$netfile = [ADSI]"WinNT://$computer/LanmanServer"               

$netfile.Invoke("Resources") | foreach {                 
try{                          
$collection += New-Object PsObject -Property @{               
Id = $_.GetType().InvokeMember("Name", ‘GetProperty’, $null, $_, $null)         
itemPath = $_.GetType().InvokeMember("Path", ‘GetProperty’, $null, $_, $null)        
UserName = $_.GetType().InvokeMember("User", ‘GetProperty’, $null, $_, $null)        
LockCount = $_.GetType().InvokeMember("LockCount", ‘GetProperty’, $null, $_, $null)      
Server = $computer                      
}                           
}                           
catch{                         
if ($verbose){write-warning $error[0]}                 
}                           
}                           
}                           
Return $collection                      
} 

J'ai utilisé les méthodes suivantes, mais aucune d'elles ne fonctionne. Certains des exemples ci-dessous fonctionneront pour la fonction intégrée mais ma condition est que je dois utiliser la fonction personnalisée.

# NOT WORKING #1 
$s = New-PSSession -ComputerName remote-STL 
$CifServer = "fs-STL-01" 
function get-openfiles{..} 
invoke-command -Session $s -ScriptBlock ${function:get-openfiles} -ArgumentList $CifServer 

# NOT WORKING #2 
$s = New-PSSession -ComputerName remote-STL 
$CifServer = "fs-STL-01" 
invoke-command -Session $s -ScriptBlock {Import-Module C:\scripts\grp-functions.psm1} 
invoke-command -Session $s -ScriptBlock {get-openfiles -computername $args[0]} -ArgumentList $CifServer 

# Not working #3 
$s = New-PSSession -ComputerName remote-STL 
$CifServer = "fs-STL-01" 
invoke-command -Session $s -ScriptBlock {Import-Module C:\scripts\grp-functions.psm1} 
invoke-command -Session $s -ScriptBlock { param($CifServer) get-openfiles -computername $Cifserver } -ArgumentList $CifServer 

# Not working #4 
$CifServer = "fs-STL-01" 
function get-openfiles{..} 
invoke-command -ComputerName remote-STL -ScriptBlock ${function:get-openfiles} -ArgumentList $CifServe 

# not working #5 
$CifServer = "fs-STL-01" 
invoke-command -ComputerName remote-STL -ScriptBlock {get-openfiles -computername $args[0]} -ArgumentList $CifServer 

Merci d'y jeter un coup d'œil!

+0

Les deux avec $ {function: get-openfiles} envoient (peut-être) la définition de la fonction, mais vous n'appelez pas la fonction après cela. Je pense que vous aurez besoin de combiner cela avec le scriptblock en prenant un paramètre pour cifserver, puis en appelant get-openfiles – TessellatingHeckler

+0

Si vous avez supprimé '-Session $ s' de votre premier exemple (et en créant la session en premier lieu), et inversé pour '-ComputerName 'fs-STL-01'' cela fonctionnerait très probablement. Cette syntaxe fonctionne pour moi. – Robin

+0

Salut, Robin. Pour être clair, pourriez-vous s'il vous plaît me donner la syntaxe complète qui a fonctionné pour vous? Je ne comprends pas comment tu as fait l'échange et travaillé pour toi. – LeonC

Répondre

2

Vous devriez envoyer toute la fonction dans votre scriptblock.

invoke-command -ComputerName computername -ScriptBlock {function get-whatever {dir}; get-whatever } -Credential (get-credential youruser) 

Cet exemple exécute la fonction get-whatever qui est uniquement la commande dir et constitue la preuve de concept. Changez-le en votre code désiré.

+0

J'ai appliqué à la preuve de concept. Cela a fonctionné partiellement ... ce qui signifie que le serveur TS distant a pris la fonction personnalisée mais il a renvoyé le résultat pour le serveur TS distant, pas le résultat pour Cifs Server. Voici mon code: '$ cifServer =" fs-stl-01 "' '$ remoteServer =" remote-STL "' '$ scriptBlock = {fonction get-openfiles {..}; get-openfiles} ' ' invoke-command -Nom d'ordinateur $ remoteServer -ScriptBlock $ scriptblock -ArgumentList $ CifServer' – LeonC