3

У меня есть два сценария PowerShell. Один скрипт вызывает другой скрипт PowerShell с использованием дополнительных учетных данных с использованием Start-Process.PowerShell - скрипт 1 вызывает скрипт 2 - как вернуть значение из сценария 2 в сценарий 1

Но я борюсь с тем, как сделать второй скрипт возвращать выходное значение в первый скрипт.

Вот скрипт # 1, который вызывается с script1.psl "отправитель-ф = 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 

Когда я выполнить сценарий, выход

Output is 

И здесь Скрипт2, который выдает желаемое значение в CMD окно вместо возврата значения в сценарии 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 
} 

Я ш lling использовать другие функции и командлеты, но абсолютно необходимо, чтобы сценарий автоматически запускался в повышенном режиме, потому что сторонняя программа вызывает сценарий 1, который вызывает скрипт 2, поэтому сценарий 2 должен отправить значение обратно в сценарий 1, который идет сторонней программе.

(Я разместил обновленный вопрос в вопросе, ProcessStartInfo and Process in PowerShell - Authentication Error).

ответ

2

Вы можете использовать ProcessStartInfo и Process, что позволит вам ознакомиться с стандартным вызовом.

Вот пример того, что вы могли бы сделать:

$startInfo = New-Object System.Diagnostics.ProcessStartInfo 
$startInfo.FileName = "powershell.exe" 
$startInfo.Arguments = "C:\script\script2.ps1" 

$startInfo.RedirectStandardOutput = $true 
$startInfo.UseShellExecute = $false 
$startInfo.CreateNoWindow = $false 
$startInfo.Username = "DOMAIN\Username" 
$startInfo.Password = $password 

$process = New-Object System.Diagnostics.Process 
$process.StartInfo = $startInfo 
$process.Start() | Out-Null 
$standardOut = $process.StandardOutput.ReadToEnd() 
$process.WaitForExit() 

# $standardOut should contain the results of "C:\script\script2.ps1" 
$standardOut 
+0

@ Дэвид Мартин Этот код очень полезно, но я все еще возникают проблемы. Я редактировал свой оригинальный вопрос с обновленным кодом. – Glowie

+1

@ Дэвид Мартин Крошечная вещь в коде, который вы ввели пароль в свойстве Username – Bostwick

+0

Ты издеваешься! Итак, чтобы вернуть значение из скрипта2 в script1, мне действительно нужно пройти все это, с передачей учетных данных и всего? Як! Я предпочел бы работать, превращая скрипт в функцию. –