Quand je cours
Get-WmiObject win32_SystemEnclosure -Computer hostname | select serialnumber
cela fonctionne pour les hôtes locaux et distants.
Quand je fais cela pour une liste d’hôtes utilisant
ForEach ($_ in gc u:\pub\list.txt) {
Get-WmiObject win32_SystemEnclosure -Computer $_ | select serialnumber | format-table -auto @{Label="Hostname"; Expression={$_}}, @{Label="Service Tag"; Expression={$_.serialnumber}}
}
il revient
Get-WmiObject: le serveur RPC n'est pas disponible. (Exception de HRESULT: 0x800706BA)
Vérifiez que la règle "Windows Management Instrumentation (WMI-In)" est activée dans le pare-feu pour chaque ordinateur distant.
Ou dans une exécution de commande administrative/invite Powershell:
netsh advfirewall firewall set rule group="Windows Management Instrumentation (WMI)" new enable=yes
Votre code n'utilise probablement pas un nom d'ordinateur correct, vous devriez le vérifier.
Votre erreur est:
Get-WmiObject: le serveur RPC n'est pas disponible. (Exception de HRESULT: 0x800706BA)
C'est le résultat que vous obtenez lorsqu'une machine n'est pas accessible. Les suggestions de pare-feu sont donc raisonnables, mais dans ce cas, probablement pas correct car vous dites que cela fonctionne:
Get-WmiObject win32_SystemEnclosure -Computer hostname
Donc, dans votre cas, il semble que lorsque cette ligne est exécutée:
Get-WmiObject win32_SystemEnclosure -Computer $_
$ _ ne contient pas un nom d'ordinateur approprié. Vous pouvez vérifier le type et le contenu de $ _. Il y a probablement un problème avec le contenu du fichier. Si le fichier est correct, les lignes ne sont peut-être pas correctement terminées. Peut-être regarder de plus près avec Write-Host:
ForEach ($_ in gc u:\pub\list.txt) {
Write-Host "Get-WmiObject win32_SystemEnclosure -Computer '$_'"
Get-WmiObject win32_SystemEnclosure -Computer $_ | select serialnumber | format-table -auto @{Label="Hostname"; Expression={$_}}, @{Label="Service Tag"; Expression={$_.serialnumber}}
}
Cela peut être dû à divers problèmes. Je ne peux pas dire lequel est là dans votre cas.
Les raisons indiquées ci-dessous peuvent être là:
Certains services liés à WMI sont comme donnés:
Pour le réglage DCOM, voir:
HKLM\Software\Microsoft\OLE
, valeur: EnableDCOM
La valeur doit être définie sur 'Y'.
J'avais le même problème mais seulement avec quelques machines. J'ai trouvé que l'utilisation de Invoke-Command pour exécuter la même commande sur le serveur distant fonctionnait.
Donc au lieu de:
Get-WmiObject win32_SystemEnclosure -ComputerName $hostname -Authentication Negotiate
Utilisez ceci:
Invoke-Command -ComputerName $hostname -Authentication Negotiate -ScriptBlock {Get-WmiObject win32_SystemEnclosure}
Si vous avez essayé certaines des suggestions figurant dans les autres réponses, notamment:
Windows Management Instrumentation (WMI)
Ensuite, considérez autres raisons courantes pour obtenir cette erreur:
Résolu.
J'exécutais exactement le même message d'erreur lorsque j'essayais d'exécuter le script suivant (partiel) sur une VM] distante configurée pour figurer dans WORKGROUP.
Restart-Computer -ComputerName MyComputer -Authentication Default -Credential $cred -force
J'ai remarqué que je pouvais exécuter le script à partir d'un autre VM dans le même WORKGROUP lorsque je désactivais le pare-feu mais que je ne pouvais toujours pas le faire à partir d'une machine du domaine. Ces deux choses avec les suggestions de Stackflow sont ce qui m'a amené à la solution suivante:
Remarque: modifiez ces paramètres à vos risques et périls. Vous devez comprendre les implications de ces modifications sur la sécurité avant de les appliquer.
Sur la machine distante:
Facultatif: Si vous souhaitez exécuter des commandes telles que 'Enter-PSSession', vous devrez peut-être également procéder comme suit.
IMPORTANT! _ Il faut environ 2 minutes environ après le redémarrage de ma télécommande VM pour répondre à la commande 'Enter-PSSession' alors que d'autres services réseau démarrent sans problème. Donnez-lui quelques minutes et essayez ensuite.
Note latérale: Avant de modifier la propriété "Adresse distante" en "N'importe lequel", les deux règles étaient définies sur "Sous-réseau local".
J'ai trouvé cet article de blog qui suggérait l'ajout d'une exception de pare-feu pour "Administration à distance", ce qui a fonctionné pour nous sur nos systèmes Windows Server 2008 Enterprise.
L'activation des règles FW suivantes sur le système cible a résolu le problème sous Win2k16:
J'avais le même problème en utilisant foreach. J'ai sauvegardé la liste sur $ serveurs et utilisé ce qui a fonctionné:
ForEach ($_ in $Servers) { Write-Host "Host $($_)" | Get-WmiObject win32_SystemEnclosure -Computer $_ | format-table -auto @{Label="Service Tag"; Expression={$_.serialnumber}}
}
Désactiver le pare-feu a résolu le problème pour moi.
Je pensais ajouter que nous avions également rencontré ce problème avec plusieurs machines de notre domaine. J'ai créé une liste de machines incriminées et les ai toutes ajoutées à un fichier texte à partir duquel exécuter le script. J'ai exécuté cela à partir de l'invite CMD en utilisant des privilèges élevés.
psexec @firewallFix.txt -d netsh advfirewall firewall
set rule name="Windows Management Instrumentation (WMI-In)"
profile=domain new enable=yes profile=domain