Учетные данные работают для Get-WmiObject, но не для Invoke-Command для компьютера в другом домене?

Учетные данные работают для Get-WmiObject, но не для Invoke-Command для компьютера в другом домене?

У меня есть скрипт PowerShell, предназначенный для выполнения двух задач: проверки значения Last CheckedЦентра обновления Windows и перечисления всех дисков и проверки оставшегося места на них для удаленного сервера.

Ожидаемый результат функции:

servername
----------
Last Checked for Windows Update:
01/18/2021 08:12:46

Disk    Size    Free    %Free
C:      501.46  238.06  47.47%
E:      300.00  140.15  46.72%

Скрипт работает точно так, как и ожидалось, когда запущен на компьютере в том же домене, что и я. Однако у нас есть несколько компьютеров, которые не находятся в том же домене и используют учетную запись локального администратора для доступа. При запуске скрипта на одном из этих компьютеров часть Windows Update дает сбой, но часть Disk Space выполняется успешно.

Две части скрипта используют одно и то же PsCredential, но часть «Дисковое пространство» — это Get-WmiObjectфункция, использующая параметры -ComputerNameи , -Credentialтогда как часть «Центр обновления Windows» находится внутри Invoke-Commandфункции с параметрами -ComputerNameи .-Credential

Я не совсем понимаю, почему одно и то же PsCredentialработает для одного и не работает для другого. Возможно, нужен другой маршрут аутентификации?

Ошибка, которую я получаю от Центра обновления Windows:

[servername] Connecting to remote server servername failed with the following error message : WinRM cannot process the
request. The following error with errorcode 0x80090311 occurred while using Kerberos authentication: We can't sign you
in with this credential because your domain isn't available. Make sure your device is connected to your organization's
network and try again. If you previously signed in on this device with another credential, you can sign in with that
credential.
 Possible causes are:
  -The user name or password specified are invalid.
  -Kerberos is used when no authentication method and no user name are specified.
  -Kerberos accepts domain user names, but not local user names.
  -The Service Principal Name (SPN) for the remote computer name and port does not exist.
  -The client and remote computers are in different domains and there is no trust between the two domains.
 After checking for the above issues, try the following:
  -Check the Event Viewer for events related to authentication.
  -Change the authentication method; add the destination computer to the WinRM TrustedHosts configuration setting or
use HTTPS transport.
 Note that computers in the TrustedHosts list might not be authenticated.
   -For more information about WinRM configuration, run the following command: winrm help config. For more
information, see the about_Remote_Troubleshooting Help topic.
    + CategoryInfo          : OpenError: (servername:String) [], PSRemotingTransportException
    + FullyQualifiedErrorId : AuthenticationFailed,PSSessionStateBroken

Сценарий такой:

$server = "servername"
$adminaccount = $server + "\localadminaccount"
$PASSWORD = ConvertTo-SecureString "localadminpassword" -AsPlainText -Force
$UNPASSWORD = New-Object System.Management.Automation.PsCredential $adminaccount, $PASSWORD

$out = ""
$out += $server + "`n----------`n"
$out += Invoke-Command -ComputerName $server -Credential $UNPASSWORD -ScriptBlock {
    Function Get-LocalTime($UTCTime) {
        $strCurrentTimeZone = (Get-WmiObject win32_timezone).StandardName;
        $TZ = [System.TimeZoneInfo]::FindSystemTimeZoneById($strCurrentTimeZone);
        Return [System.TimeZoneInfo]::ConvertTimeFromUtc($UTCTime, $TZ);
    } 

    $updateInfo = "Last Checked for Windows Update: `n";
    $updateInfo += Get-LocalTime $(New-Object -ComObject Microsoft.Update.AutoUpdate).Results.LastSearchSuccessDate;
    $updateInfo += "`n`n"
    
    Return $updateInfo
}

$out += "Disk`tSize`tFree`t%Free`n"
$disks = Get-WmiObject Win32_LogicalDisk -computername $server -filter DriveType=3 -Credential $UNPASSWORD
foreach ($objdisk in $disks)
{
    $size = "{0:N2}" -f ($objDisk.Size/1GB)
    $free = "{0:N2}" -f ($objDisk.FreeSpace/1GB)
    $freePercent="{0:P2}" -f ([double]$objDisk.FreeSpace/[double]$objDisk.Size)

    $out += $objDisk.DeviceID + "`t" 
    $out += $size + "`t" 
    $out += $free + "`t" 
    $out += $freePercent + "`n"
}
$out

решение1

Насколько я могу судить, Invoke-Commandкомпьютер должен быть доверенным хостом, если он не находится в том же домене, поэтому решение заключается в том, чтобы добавить компьютер в качестве доверенного хоста.

Чтобы не вмешиваться без необходимости в работу доверенных хостов, я реализовал решение таким образом, что оно повлияет на доверенные хосты лишь временно:

До Invoke-Command(добавление доверенного хоста):

$curHosts = (Get-ChildItem WSMan:\localhost\Client\TrustedHosts).Value
Set-Item WSMan:\localhost\Client\TrustedHosts -Value $server -Concatenate -Force

После Invoke-Command(сброса доверенных хостов):

Set-Item WSMan:\localhost\Client\TrustedHosts $curHosts -Force

Связанный контент