Ho una rete con server Windows 2003, 2008 e 2008r2. Ho uno script PowerShell che ho scritto per patchare una macchina locale usando gli oggetti com "Microsoft.Update". (Simile a Windows Update PowerShell Remoting .) Il mio script funziona meravigliosamente localmente, ma mi piacerebbe usare le sue funzioni da remoto poiché ho un buon numero di server da gestire. In quel caso cade (in modo simile a quell'altro post, che non è stato risolto).
Sono stato comunque in grado di restringere il fallimento a due metodi su una classe particolare.
(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateDownloader()
(New-Object -ComObject "Microsoft.Update.Session").CreateUpdateInstaller()
Se li esegui in una PowerShell localmente come amministratore, non avrai problemi. Se si tenta di utilizzare invoke-command (o enter-session o winrs) verrà visualizzato il seguente errore. (Questo è il test con localhost, ma qualsiasi host lo farà. Ho anche provato con diversi metodi di autenticazione come credssp e 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
Ho visto questo citato sui blog come un bug, ma senza backup di tale affermazione. Esistono due soluzioni alternative ed entrambe non mi rendono felice.
- Utilizzare psexec per eseguire comandi come utente del sistema. PSExec è ciò che sto cercando di non utilizzare in quanto si è dimostrato inaffidabile. Vorrei anche una soluzione PowerShell pura.
- Creare un'attività pianificata e comunicarlo per eseguire lo script come utente di sistema. (tramite il suo post ) Questo non è solo disordinato ma poi non avrò i risultati dell'aggiornamento. Dovrò accedere a un file o aggiornare un database o qualcosa del genere.
Sono aperto ad altri modi per eseguire gli aggiornamenti su un host in remoto poiché questo sembra essere un problema che molte persone stanno colpendo.
Ho trovato alcuni documenti che spiegano il messaggio ma non il motivo o la soluzione alternativa.
Valore restituito Restituisce S_OK in caso di successo. In caso contrario, restituisce un codice di errore COM o 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.
Come fa a sapere che sono su un computer remoto?