使用PSSession(远程powershell)执行CMD或EXE文件导致错误1603访问被拒绝



我有以下脚本powershell命令,但它返回拒绝访问。我认为错误1603是由远程访问服务器引起的。但是,$usernamecomputer01服务器中具有管理权限。

为了重新检查我的直觉是否正确,我尝试用以下内容进行测试,但我的访问被拒绝:

Start-Process cmd -Credential $Cred

更新

该错误是由$Cred引起的。删除-Credential参数效果良好。

更新结束

commands在使用cmd.execomputer01机器中直接执行没有问题。

在这种情况下,我想使用cmd /c,因为我需要从SETUP.EXE安装程序中获得真正的退出代码。

请参阅下面的完整脚本:

$script = {
#Param( 
#   [String]$username,
#   [String]$password
#)
# $Cred = New-Object System.Management.Automation.PSCredential ($username, $password)
$respfile = "$env:TEMPtest.resp"

echo 'key=value' > $respfile
$username = "$env:USERDOMAIN$env:USERNAME"
Write-Host Hello $username

$Creds = (Get-Credential -Credential "$env:USERDOMAIN$env:USERNAME" )
Start-Process cmd -Credential $Creds
#This command cannot be run due to the error: Access is denied.
#    + CategoryInfo          : InvalidOperation: (:) [Start-Process], #InvalidOperationException
#    + FullyQualifiedErrorId : #InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand
#    + PSComputerName        : computer01

# cmd /c "$pathSETUP.EXE /INSTALL -s /RESPFILE:'$respfile'"
runas /user:$Username "SETUP.EXE" /INSTALL -s /RESPFILE:"$respfile"
echo $LASTEXITCODE
# Error 1603

}
#$username = 'domain/user'
#$password = 'password'
$server = 'computer01'
$Creds = New-Object System.Management.Automation.PSCredential 
$session = New-PSSession -ComputerName $server
#Invoke-Command -Session $session -Scriptblock $script -Argumentlist $username, $password
Invoke-Command -Session $session -Scriptblock $script -Credential $Creds #updated based on @postanote advise
Remove-PSSession -ComputerName $server

我发现以下类似的链接是远程安装的,但不想使用ENTER-PSSession命令。我不想退出当前的PSSession并再次远程加入服务器,只是为了安装然后退出。

如何仅使用PSSession并在远程服务器中成功执行安装程序,有什么建议吗?

正如评论中提到的,您不需要cmd.exe。您可以使用调用/调用运算符&来指定行上的下一个令牌是命令:

& "$pathSETUP.EXE" /INSTALL -s /RESPFILE:$respfile

当然,要实现这一点,SETUP.EXE的参数必须正确(我不知道情况是否如此(。

永远不要在脚本中传递纯文本密码。它使你面临非必要的风险 使用适当的安全凭据模型。

•在Windows PowerShell 中使用密码、安全字符串和凭据

•快速安全地存储您的凭证powershell

PowerShell远程处理需要使用隐式(New-PSSession(或显式(Enter-PSSession(会话。

•关于远程需求

只有少数cmdlet可以在未启用PSRemoting的情况下用作非Admin ir运行。

•提示:在不使用远程处理或WinRM 的情况下使用Windows PowerShell远程工作

如上面Powershell帮助文件|MS Docs链接中所述,使用PSRemoting时,您必须使用远程主机上的管理员帐户。

在Windows操作系统中,要安装软件,您必须是管理员并在管理会话中运行。

PowerShell在启动它的用户的上下文中运行。

如果您试图在另一个用户上下文(即Windows安全边界(中运行,并且没有PowerShell本身就无法做到这一点,则需要其他工具,如MS Sysinternals PSExec。另请参阅:

Find-Module -Name '*Invoke*' | Format-Table -AutoSize
# Results
<#
Version     Name                                 Repository Description                                                                                        
-------     ----                                 ---------- -----------                                                                                        
...                                                         
3.1.6       Invoke-CommandAs                     PSGallery  Invoke Command as System/User on Local/Remote computer using ScheduleTask.                         
...
#>

尝试此重构选项。。。

$script = {
$Creds = (Get-Credential -Credential "$env:USERDOMAIN$env:USERNAME" )

$respfile = 'whatever this is'     
& "SETUP.EXE /INSTALL -s /RESPFILE:'$respfile'"
Write-Output $LASTEXITCODE
}
$server   = 'computer01'
$session  = New-PSSession -ComputerName $server
Invoke-Command -Session $session -Scriptblock $script -Credential $Creds
Remove-PSSession -ComputerName $server

详细信息

# Get specifics for a module, cmdlet, or function
(Get-Command -Name Invoke-Command).Parameters
(Get-Command -Name Invoke-Command).Parameters.Keys
Get-help -Name Invoke-Command -Examples
# Results
<#
Invoke-Command -ComputerName server01 -Credential domain01user01 -ScriptBlock {Get-Culture}
$s = New-PSSession -ComputerName Server02 -Credential Domain01User01
$LiveCred = Get-Credential
Invoke-Command -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.exchangelabs.com/PowerShell -Credential $LiveCred -Authentication Basic 
Invoke-Command -Session $s -ScriptBlock { Get-HotFix } -SessionOption $so -Credential server01user01
Enable-WSManCredSSP -Delegate Server02
Set-Item WSMan:Server02*ServiceAuthCredSSP -Value $True
Invoke-Command -Session $s -ScriptBlock {Get-Item \Net03ScriptsLogFiles.ps1} -Authentication CredSSP -Credential Domain01Admin01
#>
Get-help -Name Invoke-Command -Full
Get-help -Name Invoke-Command -Online

所以,我能够解决我的问题。

1603是由setup.exe抛出的错误。

可以肯定的是,我首先使用CMD直接在服务器中手动执行了以下操作,它正在工作!

$pathSETUP.EXE /INSTALL -s /RESPFILE:'$respfile'

我做了很多测试。经过研究,正如上面评论中提到的,我使用powershell执行程序的方式不同。我甚至使用ACL来更改安装程序目录/文件的所有权,切换到不同的用户帐户(具有不同的特权(,但仍然被拒绝访问(包括Admin帐户(。

过了几天,我才意识到手动磨合机和远程磨合机输出文件大小的差异。原因是CCD_ 21。确实值得检查访问被拒绝的每一个可能原因/场景。另外,我无法提取setup.exe及其内容进行故障排除。

$respfile是通过powershell创建的。我注意到powershell创建的大小与所需的CMD大小相比增加了一倍。这样,我假设setup.exe读取UTF-8格式的文件。我只知道它是通过CMD触发的,而不是通过powershell触发的。

我突然发现了不同Powershell和CMD大小的链接,并将文件内容转换为CMD可读文件-utf8。在将$respfile转换为UTF-8格式后,我能够成功地运行exe。

希望这也能帮助其他人!

最新更新