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 *

问题已解决