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
Vous devez vous connecter pour publier un commentaire.
Vous pourriez faire usage de ProcessStartInfo et Processus qui vous permettra de lire les StandardOutput.
Voici un exemple de ce que vous pourriez faire:
David Martin petite chose dans le code que vous mettez le mot de passe le nom d'utilisateur de la propriété
Le problème était que le second script (qui ne pouvait pas être changé) était en cours d'exécution dans un contexte de sécurité différent, par conséquent, toutes les cerceaux pour sauter à travers.
Vous pouvez simplement copier les résultats de votre deuxième script dans votre première ou d'affecter le résultat à une variable. par exemple, $newvariable = .\2.ps1 Si vous avez une question spécifique, vous devriez poster une nouvelle question, je suis sûr que vous aurez beaucoup de réponses.
Hmmm. J'aime cette
$newvariable = .\2.ps1
idée. Je vais l'étudier. Merci pour la peine.OriginalL'auteur David Martin