使用 powershell Invoke-Command 在 C 中安装应用程序:

使用 powershell Invoke-Command 在 C 中安装应用程序:

我想在创建虚拟机后在远程机器上安装 anydesk。问题是使用远程 powershell 命令时,我无法安装它并出现访问被拒绝错误。

Invoke-Command -ComputerName $RemoteMachine -Credential $Cred `
               -ScriptBlock {        
                \\10.1.1.3\share\apps\TOOLS\AnyDesk.exe --install C:\ --start-with-win
               } 

说:

Access is denied
    + CategoryInfo          : OperationStopped: (:) [], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException
    + PSComputerName        : 10.1.1.40

另外,我尝试使用以下Start-Process选项-Verb

 Invoke-Command -ComputerName $RemoteMachine -Credential $Cred 
                -ScriptBlock {        
                 Start-Process -FilePath "\\10.1.1.3\share\apps\TOOLS\AnyDesk.exe" -ArgumentList "--install C:\ --start-with-win" -Verb RunAs
                } 

但是,我遇到了同样的错误:

Access is denied
    + CategoryInfo          : NotSpecified: (:) [Start-Process], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.St 
   artProcessCommand
    + PSComputerName        : 10.1.1.40

有什么办法可以解决这个问题吗?

更新:

在下面的完整代码中,我能够将用户和密码传递给远程计算机,并dir在访问共享文件夹之前运行命令。我还必须强调共享文件夹是公开的。如果我手动登录到我的远程计算机(10.1.1.40),我无需任何密码\\10.1.1.3即可打开。\\10.1.1.3\share\apps\Tools

$RemoteMachine = "10.1.1.40"
Set-Item WSMan:\localhost\Client\TrustedHosts -Value $RemoteMachine
$Username = 'user'
$Password = ' '
$pass = ConvertTo-SecureString -AsPlainText $Password -Force
$Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$pass

Invoke-Command -ComputerName $RemoteMachine -Credential $Cred -ScriptBlock {        
             & {
               dir
               Start-Process -FilePath "\\10.1.1.3\share\apps\TOOLS\AnyDesk.exe" -ArgumentList "--install C:\ --start-with-win" -Verb RunAs
               } }

输出是

PS C:\Windows\system32> C:\Users\user\Desktop\anydesk.ps1


    Directory: C:\Users\user\Documents


Mode                 LastWriteTime         Length Name                     PSComputerName         
----                 -------------         ------ ----                     --------------         
d-----          1/7/2021  12:48 AM                PowerShell               10.1.1.40              
d-----          1/7/2021  12:48 AM                WindowsPowerShell        10.1.1.40              
Access is denied
    + CategoryInfo          : NotSpecified: (:) [Start-Process], UnauthorizedAccessException
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.St 
   artProcessCommand
    + PSComputerName        : 10.1.1.40

答案1

正如其他关于双跳作为问题,您确实需要按照其中一种方法配置委派和信任,以使其按照您在此处尝试的方式工作。

问题是远程机器正尝试从 UNC 路径执行可执行文件,而所使用的凭据遇到双跳问题且未配置为委派等。

您可以通过首先将文件从 UNC 路径复制到远程计算机的本地文件系统来解决此问题,这样当从那里调用安装时,安装将继续进行。

我编写了几个使用显式凭据的 PowerShell 脚本变体,这些脚本不需要配置任何委派或信任即可在远程计算机上执行可执行文件。这将允许它按照解决方法继续安装过程。

PowerShell 脚本说明

  • 虽然这里提供的 PowerShell 逻辑变体用于Get-Credential设置$Cred变量,但这种使用System.Management.Automation.PSCredential很简单,我假设您已经掌握了它,并可以根据您的任务需要进行工作。

  • 另请注意,这些解决方案使用-Wait带有Start-Process因此它将等待安装完成,然后从本地计算机中删除可执行文件以进行清理。也许这不是问题,或者您可以删除-wait并稍后进行清理以帮助加快整个过程。

解决方法 PowerShell(变体 1)

笔记: 此变体假定您执行 PowerShell 的帐户已经有权访问C$,或您要将可执行文件复制到的远程计算机上的任何其他共享文件夹,并且凭据仅用于在远程计算机上执行和安装该文件的权限。

$cred = Get-Credential "domain\username";

$RemoteMachine = "10.1.1.40";
$PackageName = "AnyDesk.exe";
$SourceDir = "\\10.1.1.3\share\apps\TOOLS";

$PackageNameDir = "$SourceDir\$PackageName";
$Pkg = "$SourceDir\$PackageName";

Copy-Item $Pkg -Destination "\\$RemoteMachine\C$";

Invoke-Command -ComputerName $RemoteMachine -ScriptBlock {
    Start-Process -FilePath "C:\$using:PackageName" -ArgumentList "--install C:\ --start-with-win" -Wait;
    } -Credential $cred;

Remove-Item "C:\$PackageName" -Force;

解决方法 PowerShell(变体 2)

笔记: 此变体假定您使用的凭据用于访问C$或您要将可执行文件复制到的远程计算机上的任何其他共享文件夹,以及用于在远程计算机上执行和安装该文件的权限。

$cred = Get-Credential "domain\username";

$RemoteMachine = "10.1.1.40";
$PackageName = "AnyDesk.exe";
$SourceDir = "\\10.1.1.3\share\apps\TOOLS"

$PackageNameDir = "$SourceDir\$PackageName";
$Pkg = "$SourceDir\$PackageName";

New-PSDrive -Name x -PSProvider FileSystem -Root "\\$RemoteMachine\C$" -Credential $cred
Copy-Item $Pkg -Destination "\\$RemoteMachine\C$";
Remove-PSDrive -Name x;

Invoke-Command -ComputerName $RemoteMachine -ScriptBlock {
    Start-Process -FilePath "C:\$using:PackageName" -ArgumentList "--install C:\ --start-with-win" -Wait
    } -Credential $cred;

New-PSDrive -Name x -PSProvider FileSystem -Root "\\$RemoteMachine\C$" -Credential $cred
Remove-Item "C:\$PackageName" -Force;
Remove-PSDrive -Name x;

支持资源

答案2

我怀疑问题在于远程会话没有存储您的密码,并且无法\\10.1.1.3匿名连接到服务器(与 NFS 不同,SMB 服务器始终需要身份验证)。

您需要配置 Invoke-Command 以“委托”您的凭据(密码、Kerberos 票证)给远程服务器。本文提供了几种方法 - 虽然它主要讨论嵌套的 Invoke-Command,但所有内容仍然适用于 SMB 文件共享访问。

相关内容