我有以下脚本powershell命令,但它返回拒绝访问。我认为错误1603是由远程访问服务器引起的。但是,$username
在computer01
服务器中具有管理权限。
为了重新检查我的直觉是否正确,我尝试用以下内容进行测试,但我的访问被拒绝:
Start-Process cmd -Credential $Cred
更新
该错误是由$Cred
引起的。删除-Credential
参数效果良好。
更新结束
commands
在使用cmd.exe
的computer01
机器中直接执行没有问题。
在这种情况下,我想使用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。
希望这也能帮助其他人!