PS 脚本成功连接到域机器但无法连接到子域机器
PS script successfully connects to domain machines but cannot connect to subdomain machines
我正在编写一个脚本来远程管理公司网络中的机器。
访问主域机器时,我没有问题。 (例如:machine1.bill.ca)
尝试连接到子域机器时失败。 (例如:machine2.bob.bill.ca)
我首先通过 DNS 获取完整的主机名:
}elseif($Temp -is [array]){
$Ret = @()
foreach($a in $temp){
try{
$a = [System.Net.Dns]::GetHostByName($a).HostName
$Ret += $a
}catch{ Write-Host '[-]'$a 'unreachable' }
}
if([string]::IsNullOrWhiteSpace($Ret)){ VNCO-Return }
}else{
try{ $Ret = [System.Net.Dns]::GetHostByName($Temp).HostName }catch{
Write-Host '[-]'$Temp 'unreachable'
VNCO-Return
}
}
然后返回目标并用于创建会话:
try{
$ErrorActionPreference = "Stop"
Write-Host '[*] Starting remote connection'
$Sess = New-PSSession -ComputerName $Target -Credential $global:Cred
foreach ($s in $Sess){ USRC($s) }
}catch{
Write-Host '[-] Some targets may not have WinRM configured'
Write-Host '[*] Starting WinRM configuration mode'
foreach($t in $Target){
try{ UST($t) }catch{
try{
WinRM($t)
UST($t)
}catch{ Write-Host '[-] Could not connect to'$t }
然后应该在远程目标上执行内容:
function UST($t){
$s = New-PSSession -ComputerName $t -Credential $global:Cred
USRC($s)
}
function USRC($s){
Invoke-Command -Session $s -ScriptBlock {
*doing stuff*
Write-Host '[+] Settings successfully updated on'$env:COMPUTERNAME
}
}
它适用于我目前测试过的每台 bill.ca 台机器 (200+)
它适用于 none of the bob.bill.ca 到目前为止我测试过的机器(30-ish)
我使用的凭证对 bill.ca 和 bob.bill.ca.
具有相同的权限
bob.bill.ca 上的机器可以被 ping 并且 dns returns 主机名没有任何问题。
然而,脚本无法连接到 bob 上的任何机器。bill.ca.
不是问题的真正答案,但想提到上面的第一个块可以简化为:
$ret = $Temp | ForEach-Object {
$a = $_; $n = $null
try { $n = [System.Net.Dns]::GetHostEntry($a).HostName }
catch { Write-Host "[-] $a 'unreachable'" }
Write-Output $n
} | Where-Object {$_}
if (-not $ret) { Vnco-Return }
如果 $Temp
不是数组,它仍被视为包含单个元素的数组。 Where-Object
将 $null
或空字符串视为 $false
。 (-not $ret)
将空数组视为 $false
。它上面的块生成一个数组。
我用 GetHostEntry()
替换了 GetHostByName()
因为我看到提到 the former is deprecated.
也可以试试看是否returns有什么不同...
function Get-MyHost($IPOrName) {
$comp = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $IPOrName
return (@($comp.Name, $comp.Domain) -Join '.')
}
这是一个受信任的主机问题。
运行 PS 以管理员身份执行此命令:
PS C:> Set-item wsman:localhost\client\trustedhosts -value *
问题已解决
我正在编写一个脚本来远程管理公司网络中的机器。
访问主域机器时,我没有问题。 (例如:machine1.bill.ca)
尝试连接到子域机器时失败。 (例如:machine2.bob.bill.ca)
我首先通过 DNS 获取完整的主机名:
}elseif($Temp -is [array]){
$Ret = @()
foreach($a in $temp){
try{
$a = [System.Net.Dns]::GetHostByName($a).HostName
$Ret += $a
}catch{ Write-Host '[-]'$a 'unreachable' }
}
if([string]::IsNullOrWhiteSpace($Ret)){ VNCO-Return }
}else{
try{ $Ret = [System.Net.Dns]::GetHostByName($Temp).HostName }catch{
Write-Host '[-]'$Temp 'unreachable'
VNCO-Return
}
}
然后返回目标并用于创建会话:
try{
$ErrorActionPreference = "Stop"
Write-Host '[*] Starting remote connection'
$Sess = New-PSSession -ComputerName $Target -Credential $global:Cred
foreach ($s in $Sess){ USRC($s) }
}catch{
Write-Host '[-] Some targets may not have WinRM configured'
Write-Host '[*] Starting WinRM configuration mode'
foreach($t in $Target){
try{ UST($t) }catch{
try{
WinRM($t)
UST($t)
}catch{ Write-Host '[-] Could not connect to'$t }
然后应该在远程目标上执行内容:
function UST($t){
$s = New-PSSession -ComputerName $t -Credential $global:Cred
USRC($s)
}
function USRC($s){
Invoke-Command -Session $s -ScriptBlock {
*doing stuff*
Write-Host '[+] Settings successfully updated on'$env:COMPUTERNAME
}
}
它适用于我目前测试过的每台 bill.ca 台机器 (200+)
它适用于 none of the bob.bill.ca 到目前为止我测试过的机器(30-ish)
我使用的凭证对 bill.ca 和 bob.bill.ca.
具有相同的权限
bob.bill.ca 上的机器可以被 ping 并且 dns returns 主机名没有任何问题。
然而,脚本无法连接到 bob 上的任何机器。bill.ca.
不是问题的真正答案,但想提到上面的第一个块可以简化为:
$ret = $Temp | ForEach-Object {
$a = $_; $n = $null
try { $n = [System.Net.Dns]::GetHostEntry($a).HostName }
catch { Write-Host "[-] $a 'unreachable'" }
Write-Output $n
} | Where-Object {$_}
if (-not $ret) { Vnco-Return }
如果 $Temp
不是数组,它仍被视为包含单个元素的数组。 Where-Object
将 $null
或空字符串视为 $false
。 (-not $ret)
将空数组视为 $false
。它上面的块生成一个数组。
我用 GetHostEntry()
替换了 GetHostByName()
因为我看到提到 the former is deprecated.
也可以试试看是否returns有什么不同...
function Get-MyHost($IPOrName) {
$comp = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $IPOrName
return (@($comp.Name, $comp.Domain) -Join '.')
}
这是一个受信任的主机问题。 运行 PS 以管理员身份执行此命令:
PS C:> Set-item wsman:localhost\client\trustedhosts -value *
问题已解决