gpt4 book ai didi

Powershell 启动进程脚本调用第二个脚本 - 如何只制作一个脚本

转载 作者:行者123 更新时间:2023-12-04 01:32:05 26 4
gpt4 key购买 nike

我有一个 powershell 脚本,它接受“sender-ip=10.10.10.10”形式的参数,并且可以在提升的凭据下完美运行

#script.ps1

$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")


<#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"
}

if ($userId -ne $NULL){
return "userId=" + $userId
}
elseif ($userID -eq $NULL)
{
$userId = "Unknown/UserID"
return "userId=" + $userId
}

由于此脚本将由不使用提升凭据的第三方程序调用,因此我必须创建第二个包含提升权限(第三方程序将调用)的 powershell 脚本

#elevated.ps1

[string]$abc = $args

<#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


[string]$output = start-process powershell -Credential $credentials -ArgumentList '-noexit','-File', 'C:\script\script.ps1', $abc

return $output

我可以手动调用 elevated.ps1

.\elevated.ps1 "sender-ip=10.10.10.10"

不是有两个脚本,即一个脚本的启动进程调用另一个脚本,如何在一个脚本中实现这一点?我相信这会简化参数传递,因为第三方程序必须调用 elevate.ps1 调用 script.ps1 并且某处发生了一些错误。

最佳答案

Windows 不允许进程在运行时提升。有一些技巧,但它们会以某种方式产生一个具有提升权限的新进程。参见 here获取更多信息。因此,PowerShell 最简单的方法仍然是使用一个脚本来启动处理提升的另一个脚本。

关于Powershell 启动进程脚本调用第二个脚本 - 如何只制作一个脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18520259/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com