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?
Réponses:
Vous ne pouvez tout simplement pas le faire, car MS ne vous permet pas de le faire via WUApi.
Les détails peuvent être trouvés ici: http://msdn.microsoft.com/en-us/library/windows/desktop/aa387288(v=vs.85).aspx
Vous pouvez essayer d'utiliser la tâche planifiée pour y parvenir.
la source
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-credential
comme ça.Un formulaire alternatif et plus direct permet de
Invoke-Command
demander des informations d'identification:la source
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 :
la source