powershell脚本来执行另一个脚本

zi8p0yeb  于 2023-03-18  发布在  Shell
关注(0)|答案(2)|浏览(241)

我试图写一个小powerscript执行现有的.ps1文件作为一个不同的用户帐户比登录。我需要定期运行现有的.ps1文件。我需要一个powershell脚本,可以双击运行,它执行现有的.ps1文件作为不同的用户。
这是我目前掌握的情况:

$username = 'username'
$password = 'password'
$script = '\\path\to\file\script.ps1'

$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential $username, $securePassword
Start-Process powershell.exe -File $script -Credential $credential

似乎凭证标志可能不在正确的位置。
希望你能给点指导。

bnl4lu3b

bnl4lu3b1#

顺便说一句:为了安全起见,最好避免使用 plain-text密码,尤其是在脚本中存储密码时。

TL;医生

Start-Process powershell.exe "-File `"$script`"" -Credential $credential

Start-Process具有指定目标 * 可执行文件的**-FilePath参数和接受传递给该可执行文件的所有 * 参数 * 的数组 * 类型的-ArgumentList参数**。
这两个参数是前两个 * 位置 * 参数,因此不必严格地为它们 * 命名 *,但必须满足-ArgumentList的语法要求,这意味着两件事:

  • 如果您 * 单独 * 传递传递参数,则必须使用,分隔它们(这将创建一个 array)。
  • 虽然不是 * 所有 * 传递参数都需要 * 引号 *,但那些带有特殊字符的参数需要,特别是包括那些 * 以- * 开头的参数,因为Start-Process会将它们解释为 * 它的 * 参数。

因此:

# !! May, but isn't guaranteed to work - see below.
Start-Process powershell.exe '-File', $script -Credential $credential

它是以下内容的缩写:

# !! May, but isn't guaranteed to work - see below.
Start-Process -FilePath powershell.exe -ArgumentList '-File', $script -Credential $credential

不幸的是,一个长期存在的bug(为了向后兼容而无法修复)使这种方法 * 脆弱*,因为PowerShell在后台构造进程命令行时 * 不 * 为您应用按需双引号和转义-请参见GitHub issue #5576
因此,您必须 * 自己 * 执行任何嵌入式双引号和转义,如果您将一个 * 单个 * 字符串传递给-ArgumentList(该字符串对要传递的 * 所有 * 参数进行编码),则最终会更容易**做到这一点,如顶部的解决方案所示。

tpgth1q7

tpgth1q72#

正如mklement 0正确指出的,最好不要显式使用密码,我建议使用start-job而不是运行单独的脚本,另外,我将自己添加密码加密函数。

function setCred($role,$credPath){
    $credMassiv = @()
    if (Test-Path "$credPath\cred.csv"){$credMassiv = @(Import-Csv -Delimiter ";" -Path "$credPath\cred.csv")}
    else {$credMassiv = @()}
    $array = "" | Select user, Encrypted, role
    $array.user = read-host "user for $role"
    $pwd = read-host "password:" -AsSecureString
    $array.Encrypted = ConvertFrom-SecureString -SecureString $pwd
    $array.role = $role
    $cred = New-Object System.Management.Automation.PSCredential -ArgumentList $array.user, $pwd
    $credMassiv += $array
    $credMassiv |Export-Csv -Delimiter ";" -Encoding UTF8 -Path "$credPath\cred.csv"

    $cred
}


function getCred($role,$credPath){
$credMassiv = @()
$array = "" | Select user, Encrypted, role
    if (!(Test-Path "$credPath\cred.csv")){ $cred = setCred $role $credPath }

    if (Test-Path "$credPath\cred.csv"){
        $credMassiv = Import-Csv -Delimiter ";" -Path "$credPath\cred.csv"

        $user = $credMassiv |Where-Object {$_.role -eq $role} |Select-Object -Expand user
        $pwd = $credMassiv |Where-Object {$_.role -eq $role} |Select-Object -Expand Encrypted | ConvertTo-SecureString
        
        if ([string]::IsNullOrEmpty($pwd)){$cred = setCred $role $credPath}
        else {$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $user, $pwd}
    }
    

$cred
}

$credential = get-cred "worker" $PSScriptRoot

$ScriptBlock = {
 param($path)
 write-host $path

}

          $temp = Start-Job -name "script" -Credential $credential -ArgumentList "C:\test" -ScriptBlock $ScriptBlock 
Get-Job -Name "script"

输出:C:\测试

相关问题