我尝试使用Powershell PSSession cmdlets,但我正在努力解决访问被拒绝错误。
我尝试做的是使用管理员帐户运行命令New-PSSession
(或Enter-PSSession
),不幸的是我收到拒绝访问错误。
我相信我正确地遵循了所有说明,因为在另一台服务器上我可以毫无问题地运行这些命令。
此外,我想通知test-wsman
回复我。我正在使用内置管理员帐户,并且已经选中了Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI
所有的特权似乎都可以。我没有更多的想法,寻求帮助。
更新
我发现了一个有趣的行为:
让我们假设:
- 机器的IP地址是22.222.222.222
- 我使用管理员凭据通过远程桌面登录
我使用以下命令:
new-pssession // access denied
new-pssession localhost // access denied
new-pssession 127.0.0.1 // access denied
new-pssession 22.222.222.222 // Session created ! It's working !
new-pssession 22.222.222.222 -Credential Get-Credential // access denied (using the same administrator credentials which I'm using for RDP)
当我运行完全相同的命令时,我可以在另一台服务器上添加它,所有命令都成功。
有什么想法吗?
PS 会话用于访问远程系统。为此,您必须进行一些配置:
1)确保 winrm 服务在所有目标系统以及本地系统中运行。
2)您必须启用PS远程处理。Enable-PSRemoting 将计算机配置为接收随WS-Man发送的 PowerShell 远程命令。
所以,以管理员身份启动Windows PowerShell。
Enable-PSRemoting –Force
3)您需要将远程计算机添加到 WinRM 中本地计算机的受信任主机列表中。为此,请键入:
winrm s winrm/config/client '@{TrustedHosts="RemoteComputer"}'
4)使用以下方法检查配置:
winrm quickconfig
完成后,可以使用New-Pssession命令创建与目标系统的交互式会话。
否则,您可以使用调用命令来执行一些远程操作,如下所示:
我在评论部分提到了它必须如何工作。样本:
$username = "Username"
$password = "Password"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr
# will list all the processess in the remote system
# if you are the entireprise admin or the domain admin then you do not have to pass the credentials. It will take the windows authentication by default.
Invoke-Command -ComputerName RemoteServer -ScriptBlock {Get-Process } -Credential $cred
既然你已经更新了问题:让我告诉你:
127.0.0.1和localhost-- 两者都指向本地系统。意味着您必须将它们添加到本地系统的受信任主机列表中。 不建议将 PSSession 用于本地系统,因为您可以直接在 PS 控制台中运行所有 ps cmdlet。
22.222.222.222-- 工作原因,您已将其添加到受信任主机列表中,并且默认情况下它正在使用Windows身份验证
22.222.222.222 - 凭据获取凭据----不起作用,因为格式有点错误。像这样使用:
New-PSSession -ComputerName 22.222.222.222 -Credential (Get-Credential)
希望对您有所帮助。
最后有一个可能的答案,但一些背景可能会有所帮助,所以我从这个开始。
介绍
重要的是要注意,我的答案只与环回(localhost
)会话有关。它不能解决远程会话的问题。
环回会话非常有用,因为它们使具有管理员权限的用户能够调用本地主机上的用户命令或脚本。例如,从系统用户下运行的系统监视程序向登录用户发送 Toast 消息。(是的,可能有更好的方法可以做到这一点,但这不是这里讨论的内容)。
背景
我遇到了完全相同的问题,结果与@Piotr原始问题的更新部分中显示的结果完全相同。我在谷歌上广泛搜索了答案,但没有找到有效的答案——尽管有些人报告了非常相似的问题。
规格
由于大多数使用Powershell远程处理的人似乎没有这个问题,这可能与我的机器规格有关:
- 视窗 10 家庭版 1803。
- 使用 WiFi 连接的专用网络
PS Env:> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.17134.858
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.17134.858
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
可能的答案
EnableNetworkAccess
选项对我有用,但我还不知道为什么。它被确认适用于PowerShell命令New-PSSession
和Invoke-Command
,也可能适用于其他人。
例子
若要配置 PowerShell 远程处理,需要以下命令一次,尽管它 如果重复,不会伤害任何东西。它仅适用于专用(非公共)网络。
PS Env:> Enable-PSRemoting -force
以下示例不需要在"受信任的主机">中输入条目。
计算机名称LAPTOP-XZ
==$env:COMPUTERNAME
.
=localhost
的点别名
Invoke-Command -ComputerName . -ScriptBlock { dir } -EnableNetworkAccess
New-PSSession -EnableNetworkAccess
New-PSSession localhost -EnableNetworkAccess
New-PSSession 127.0.0.1 -EnableNetworkAccess
New-PSSession LAPTOP-XZ -EnableNetworkAccess
计算机的 IPv4 地址(在我的情况下是192.168.1.103
)只有在它包含在受信任的主机中时才有效。在这种情况下,不需要EnableNetworkAccess
选项。
PS Env:> Set-Item WSMan:localhostClientTrustedHosts -Value "192.168.1.103"
New-PSSession 192.168.1.103
请注意,在受信任主机中包含localhost
及其其他别名在上述示例中不起作用(需要-EnableNetworkAccess
)。
我遇到了这个确切的问题,发现我传递的用户名必须是 FQDN。 即 username@domain.com 而不仅仅是用户名。 一旦我更新到它就起作用了。
试试这个: https://www.powershellgallery.com/packages/Invoke-PSSession
它调用会话,然后使用您提供的凭据注册 PSSession配置。基本上为该双跳提供凭据