PowerShell - script 1. les appels de script 2 - comment retourner de la valeur à partir d'un script 2 de script 1

J'ai deux scripts PowerShell. Un script appelle un autre script PowerShell à l'aide élévation des informations d'identification, en utilisant Start-Processus.

Mais j'ai du mal avec la façon de faire le deuxième script de retour la valeur de sortie pour le premier script.

Voici le script # 1, qui est invoqué avec script1.psl "expéditeur-ip=10.10.10.10"

function getUser($abc) {

    <#Previously created password file in C:\Script\cred.txt, read-host -assecurestring | convertfrom-securestring | out-file C:\Script\cred.txt#>

    $password = get-content C:\Script\cred.txt| convertto-securestring
    $credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist "DOMAIN\Username",$password
    $output = start-process powershell -Credential $credentials -ArgumentList '-noexit','-File', 'C:\script\script2.ps1', $abc
    return $output
}

[string]$abc = $args

getUser($abc)

Write-host Output is $output

Lorsque j'exécute le script, la sortie est

Output is

Et voici script2, qui affiche la valeur souhaitée à une fenêtre cmd au lieu de retourner la valeur de script 1:

$userID = $NULL
$line_array = @()
$multi_array = @()
[hashtable]$my_hash = @{}
foreach ($i in $args) {
$line_array+= $i.split(" ")
}
foreach ($j in $line_array) {
$multi_array += ,@($j.split("="))
}
foreach ($k in $multi_array) {
$my_hash.add($k[0],$k[1])
}
$Sender_IP = $my_hash.Get_Item("sender-ip")
<# Courtesy of http://blogs.technet.com/b/heyscriptingguy/archive/2012/02/19/use-powershell-to-find-last-logon-times-for-virtual-workstations.aspx#>
<# Gather information on the computer corresponding to $Sender_IP #>
$Win32OS = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $Sender_IP
<# Determine the build number #>
$Build = $Win32OS.BuildNumber
<# Running Windows Vista with SP1 and later, i.e. $Build is greater than or equal to 6001 #>
if ($Build -ge 6001) {
$Win32User = Get-WmiObject -Class Win32_UserProfile -ComputerName $Sender_IP
$Win32User = $Win32User | Sort-Object -Property LastUseTime -Descending
$LastUser = $Win32User | Select-Object -First 1
$UserSID = New-Object System.Security.Principal.SecurityIdentifier($LastUser.SID)
$userId = $UserSID.Translate([System.Security.Principal.NTAccount])
$userId = $userId.Value
}
<# Running Windows Vista without SP1 and earlier, i.e $Build is less than or equal to 6000 #>
elseif ($Build -le 6000) {
$SysDrv = $Win32OS.SystemDrive
$SysDrv = $SysDrv.Replace(":","$")
$ProfDrv = "\\" + $Sender_IP + "\" + $SysDrv
$ProfLoc = Join-Path -Path $ProfDrv -ChildPath "Documents and Settings"
$Profiles = Get-ChildItem -Path $ProfLoc
$LastProf = $Profiles | ForEach-Object -Process {$_.GetFiles("ntuser.dat.LOG")}
$LastProf = $LastProf | Sort-Object -Property LastWriteTime -Descending | Select-Object -First 1
$userId = $LastProf.DirectoryName.Replace("$ProfLoc","").Trim("\").ToUpper()
}
else{
$userId = "Unknown/UserID"
}
# Logic block to return the correct value
if ($userId -ne $NULL) {
return "userId=" + $userId
}
elseif ($userID -eq $NULL)
{
return "userId=" + $userId
}

Je suis prêt à l'utilisation d'autres fonctions, et les applets de commande, mais il est absolument nécessaire que le script s'exécute automatiquement en mode élevé, car un programme tiers est script d'appel 1, qui appelle le script 2, de sorte que le script 2 doit envoyer la valeur de retour de script 1, qui va de programme tiers.

(J'ai posté mise à jour de question en question, ProcessStartInfo et des Processus de PowerShell - Erreur d'Authentification).

OriginalL'auteur Glowie | 2013-08-30