Eu tenho um script do PowerShell destinado a fazer duas coisas: verificar o Last Checked
valor do Windows Update e enumerar todas as unidades e verificar o espaço restante nessas unidades, para um servidor remoto.
A saída esperada da função é:
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%
O script funciona exatamente como esperado ao ser executado em um computador no mesmo domínio que eu. No entanto, temos alguns computadores que não estão no mesmo domínio e usam uma conta de administrador local para acesso. Ao executar o script em um desses computadores, a parte do Windows Update falha, mas a parte do espaço em disco é executada com êxito.
As duas partes do script compartilham o mesmo PsCredential
, mas a parte do espaço em disco é uma Get-WmiObject
função que usa os parâmetros -ComputerName
e -Credential
enquanto a parte do Windows Update está dentro de uma Invoke-Command
função com -ComputerName
e-Credential
Não sei por que o mesmo PsCredential
funcionaria para um e falharia para o outro, talvez uma rota de autenticação diferente?
O erro que recebo da parte do Windows Update é:
[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
O roteiro é:
$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
Até onde eu sei,
Invoke-Command
precisa que o computador seja um host confiável se não estiver no mesmo domínio, então a solução é adicionar o computador como um host confiável.Para não mexer com hosts confiáveis desnecessariamente, implementei a solução de uma maneira que afetará apenas temporariamente os hosts confiáveis:
Antes
Invoke-Command
(adicionar um host confiável):Depois
Invoke-Command
(redefinir hosts confiáveis):