Problèmes avec les correctifs de serveurs à distance à l'aide de winrm et Microsoft.Update.Session


10

J'ai un réseau avec des serveurs Windows 2003, 2008 et 2008r2. J'ai un script PowerShell que j'ai écrit pour patcher une machine locale en utilisant les objets com "Microsoft.Update". (Similaire à Windows Update PowerShell Remoting .) Mon script fonctionne à merveille localement, mais j'aimerais utiliser ses fonctions à distance car j'ai un bon nombre de serveurs à gérer. Dans ce cas, il tombe (de la même manière que cet autre poste, qui n'a pas été résolu).

J'ai cependant pu réduire l'échec à deux méthodes sur une classe particulière.

(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateDownloader()
(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateInstaller()

Si vous les exécutez dans un PowerShell localement en tant qu'administrateur, vous n'aurez aucun problème. Si vous essayez d'utiliser invoke-command (ou enter-session, ou winrs), vous obtiendrez l'erreur suivante. (C'est un test avec localhost, mais n'importe quel hôte fera l'affaire. J'ai également essayé avec différentes méthodes d'authentification telles que credssp et kerberos.);

PS C:\> Invoke-Command -ComputerName localhost -ScriptBlock { (New-Object -ComObject "microsoft.update.session").createUpdateDownloader()}
Exception calling "CreateUpdateDownloader" with "0" argument(s): "Access is denied. (Exception from HRESULT: 0x80070005
 (E_ACCESSDENIED))"
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation

J'ai vu cela mentionné sur les blogs comme un bug, mais sans sauvegarde de cette revendication. Il existe deux solutions de contournement et les deux ne me rendent pas heureux.

  • Utilisez psexec pour exécuter des commandes en tant qu'utilisateur système. PSExec est ce que j'essaie de ne pas utiliser car il s'est avéré peu fiable. J'aimerais également une solution PowerShell pure.
  • Créez une tâche planifiée et indiquez-la pour exécuter votre script en tant qu'utilisateur système. (via son article ) Ce n'est pas seulement désordonné, mais je n'aurai pas les résultats de la mise à jour. Je vais devoir me connecter à un fichier ou mettre à jour une base de données ou quelque chose.

Je suis ouvert à d'autres façons d'exécuter des mises à jour sur un hôte à distance car cela semble être un problème que beaucoup de gens rencontrent.

J'ai trouvé des documents qui expliquent le message mais pas la raison ni la solution.

Valeur de retour Retourne S_OK en cas de succès. Sinon, renvoie un code d'erreur COM ou Windows.

This method can also return the following error codes.
Return code   Description
E_INVALIDARGA parameter value is invalid. 
E_ACCESSDENIED    This method cannot be called from a remote computer.

Comment sait-on que je suis sur un ordinateur distant?


Cela semble beaucoup plus complexe que de créer une instance WSUS et de suivre cette voie. Avez-vous envisagé cette voie?
Driftpeasant

Vous ne pouvez pas contrôler exactement quand un serveur sera racheté et vous assurer qu'il reviendra avec WSUS seul. Nous en tirons parti pour les mises à jour elles-mêmes. Je serais intéressé si vous pouviez le déclencher pour faire ce truc à la demande.
reconbot

J'ai le même problème en utilisant PowerShell Web Access sur Server 2012, en arrière-plan, il utilise également la communication à distance PowerShell. Même erreur.
Peter Hahndorf

1
Réponse possible ici serverfault.com/a/474031/23300
Nic

@reconbot je connais sa très vieille question mais je suis également confronté à un problème. Avez-vous obtenu une solution fixe ou alternative?
Machine à calculer

Réponses:



0

Une telle commande doit être exécutée avec des privilèges sur la machine distante, d'où la nécessité d'être exécutée en tant qu'utilisateur administrateur de domaine ou administrateur sur la machine distante.

Si le vôtre est le premier cas, je n'ai pas d'aide, mais vous n'êtes qu'un administrateur local, pas distant, utilisez get-credentialcomme ça.

$cred = get-credential

Invoke-Command -ComputerName localhost -credential $cred -scriptblock {}

Un formulaire alternatif et plus direct permet de Invoke-Commanddemander des informations d'identification:

Invoke-Command -scriptblock {$ENV:username} -Credential ""

Je suis en cours d'exécution avec les informations d'identification d'un compte d'administrateur, l'erreur spécifie "Cette méthode ne peut pas être appelée à partir d'un ordinateur distant."
reconbot

0

J'ai pu faire fonctionner cela en configurant un point de terminaison JEA sur le serveur distant pour l'exécuter en tant que compte virtuel local.

Depuis https://docs.microsoft.com/en-us/powershell/jea/session-configurations :

Compte virtuel local

Si les rôles pris en charge par ce point de terminaison JEA sont tous utilisés pour gérer la machine locale et qu'un compte d'administrateur local suffit pour exécuter les commandes avec succès, vous devez configurer JEA pour utiliser un compte virtuel local. Les comptes virtuels sont des comptes temporaires qui sont uniques à un utilisateur spécifique et ne durent que pendant la durée de leur session PowerShell. Sur un serveur ou un poste de travail membre, les comptes virtuels appartiennent au groupe Administrateurs de l'ordinateur local et ont accès à la plupart des ressources système. Sur un contrôleur de domaine Active Directory, les comptes virtuels appartiennent au groupe Administrateurs de domaine du domaine.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.