尝试创建 powershell 脚本以在同一网络上的远程计算机上安装程序

问题描述 投票:0回答:1

我对 Powershell 非常陌生,我正在尝试创建一个脚本,通过该脚本将文件夹从一台计算机复制到同一网络上的另一台计算机,然后当普通用户在远程计算机上以管理员身份运行批处理文件时已登录。

这就是我所拥有的,问题是,我无法让 Powershell 以管理员权限运行批处理文件。

我想运行批处理文件的原因是批处理文件中的exe需要参数才能运行,而Powershell无法识别它们。

$Session = New-PSSession -ComputerName "computer Name" -Credential "Admin creds"
Copy-Item -Path "\Local computer folder\*" -Destination "\\computer Name\C$\Temp" -Recurse -Force
Invoke-Command -ComputerName "computer Name" -Credential "Admin creds" -ScriptBlock {  Start-Process c:\temp\Install.bat -wait  }
Remove-Item –path \\computer Name\C$\Temp –recurse
Remove-PSSession $session  

我尝试了几种不同的命令,但没有成功。

powershell powershell-remoting
1个回答
0
投票

tl;dr,根据您自己的反馈:

{ Start-Process c:\temp\Install.bat -wait }
替换为
-ScriptBlock
参数:

{ c:\temp\Install.bat -wait } 

解决您的问题;它确保:

  • 同步(阻塞)执行

    • 顺便说一句:虽然您始终可以自由使用
      &
      ,但在直接调用 (& c:\temp\Install.bat -wait) 中,
      调用运算符
      是唯一需要的,如果可执行路径被 引用(通常是由于包含空格)和/或以变量表示。
  • 其中

    -wait

     作为参数 
    传递给 c:\temp\Install.bat


背景资料:
您的问题归结为:

Start-Process c:\temp\Install.bat -wait


您期望

-wait

 是一个 
pass-through 参数,即传递给 c:\temp\Install.bat

但是,

-wait

Start-Process
解释为
its-Wait
开关,因此它
同步运行批处理文件,但不传递任何参数

立即修复将是:

  • 引用您的传递参数,这是必须的如果它看起来像参数名称

  • Also pass Start-Process

    ' -Wait
     switch
    ,这是使用
    Invoke-Command
     进行远程调用时必须的,由于使用 
    -ComputerName 参数,创建了 ad hoc
     远程会话:

    • Invoke-Command
       返回时,会话将关闭,如果此时远程异步 
      Start-Process
       启动的进程尚未完成,它将被 
      killed
Invoke-Command -ComputerName "computer Name" -Credential "Admin creds" -ScriptBlock { # Note the use of -Wait for Start-Process and '-wait' as the pass-through argument. Start-Process -Wait c:\temp\Install.bat '-wait' }
但是,除了特殊情况

没有有很好的理由使用Start-Process

同步
调用控制台应用程序(例如批处理文件),所以顶部的直接调用解决方案是优选

    直接调用,除了与控制台应用程序
  • 始终同步

    之外,还允许您直接捕获它们的输出,并稍后通过自动$LASTEXITCODE变量

    查询其退出代码。

  • GitHub 文档问题 #6239

    提供了有关何时使用 Start-Process 合适或不合适的指导。

    
    

至于您
对以

elevation(管理权限)运行的担忧

  • 如果调用用户是管理员,远程命令

    总是以提升运行,并且默认情况下只有管理员才有权执行PowerShell远程处理操作。

  • 远程命令将以
  • caller's

    用户身份运行(默认情况下是调用会话的用户身份,但可以使用 -Credential 参数覆盖),这与是否或哪个用户碰巧是无关的登录到目标机器。

    
    

    换句话说:您无法使用远程调用为不同的用户执行安装
© www.soinside.com 2019 - 2024. All rights reserved.