Anmeldeinformationen funktionieren für Get-WmiObject, aber nicht für Invoke-Command für einen Computer in einer anderen Domäne?

Anmeldeinformationen funktionieren für Get-WmiObject, aber nicht für Invoke-Command für einen Computer in einer anderen Domäne?

Ich habe ein PowerShell-Skript, das zwei Dinge tun soll: den Wert von Windows Update prüfen Last Checkedund alle Laufwerke auflisten und den verbleibenden Speicherplatz auf diesen Laufwerken für einen Remote-Server prüfen.

Die erwartete Ausgabe der Funktion ist:

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%

Das Skript funktioniert genau wie erwartet, wenn es auf einem Computer in derselben Domäne wie ich ausgeführt wird. Wir haben jedoch eine Handvoll Computer, die sich nicht in derselben Domäne befinden und für den Zugriff ein lokales Administratorkonto verwenden. Wenn das Skript auf einem dieser Computer ausgeführt wird, schlägt der Windows Update-Teil fehl, aber der Festplattenspeicher-Teil wird erfolgreich ausgeführt.

Die beiden Teile des Skripts teilen sich die gleichen PsCredential, aber der Disk Space-Teil ist eine Get-WmiObjectFunktion, die die Parameter verwendet -ComputerName, und -Credentialwährend der Windows Update-Teil innerhalb einer Invoke-CommandFunktion mit -ComputerNameund ist-Credential

Ich bin nicht sicher, warum das Gleiche PsCredentialbei dem einen funktioniert und bei dem anderen fehlschlägt. Vielleicht liegt es an einem anderen Authentifizierungsweg?

Der Fehler, den ich vom Windows Update-Teil erhalte, ist:

[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

Das Skript lautet:

$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

Antwort1

Soweit ich das beurteilen kann, Invoke-Commandmuss der Computer ein vertrauenswürdiger Host sein, wenn er sich nicht in derselben Domäne befindet. Die Lösung besteht also darin, den Computer als vertrauenswürdigen Host hinzuzufügen.

Um vertrauenswürdige Hosts nicht unnötig zu beeinträchtigen, habe ich die Lösung so implementiert, dass die vertrauenswürdigen Hosts nur vorübergehend beeinträchtigt werden:

Vorher Invoke-Command(einen vertrauenswürdigen Host hinzufügen):

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

Nachher Invoke-Command(vertrauenswürdige Hosts zurücksetzen):

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

verwandte Informationen