InteropServices COMException durante l'esecuzione di un'app .net da uno script CGI Web su Windows Server 2003

StackOverflow https://stackoverflow.com/questions/890492

Domanda

Disclaimer:Sono completamente all'oscuro di .net e COM.

Ho un'applicazione di un fornitore che sembra essere scritta in .net e sto cercando di inserirla in un modulo Web (uno script Perl cgi-bin) in modo da poter eventualmente avviare l'app di questo fornitore da un computer separato.Utilizzo un sistema Windows Server 2003 R2 SE SP1 e utilizzo Apache 2.2 per il server Web e ActivePerl 5.10.0.1004 per lo script cgi.Il mio script cgi chiama l'app del fornitore che risiede sulla stessa macchina utilizzando l'operatore backtick Perl.

...
$result = "Result: " . `$vendorsPath/$vendorsExecutable $arg1 $arg2`;
...

In questo momento sto semplicemente eseguendo il browser Web IE localmente sul computer server e accedendo a "http://localhost/cgi-bin/myPerlScript.pl".L'app del fornitore fallisce e registra un messaggio di debug che include la seguente analisi dello stack (ho cambiato un paio di nomi per non rivelare l'identità del fornitore):

...
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Runtime.InteropServices.COMException (0x80043A1D): 0x80040154 - Class not registered
   --- End of inner exception stack trace ---
   at System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters)
   at System.RuntimeType.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters)
   at VendorsTool.Engine.Core.VendorsEngine.LoadVendorsServices(String fileName, String& projectCommPath)
...

Quando eseguo l'app del fornitore dalla riga di comando di Windows sul computer server con gli stessi identici argomenti passati dallo script cgi, funziona perfettamente, quindi c'è qualcosa nel richiamare la loro app tramite lo script web che causa un problema.Questo problema è probabilmente legato alla sicurezza perché il tutto funziona perfettamente su una macchina Windows XP Pro (sia dalla riga di comando che dall'invocazione web).In realtà ho sviluppato lì il mio script web e l'ho fatto funzionare completamente lì prima di provare a spostarlo sul computer Windows Server 2003.Allora, cosa c'è di diverso nella macchina Windows Server 2003 che impedirebbe all'app .net del fornitore di essere eseguita con successo da uno script web cgi?

Posso risolvere questo problema in qualche modo per farlo funzionare sul mio server o il fornitore dovrà apportare una modifica alla propria app .net e spedire una nuova versione?Probabilmente sono l'unica persona al mondo che sta tentando di eseguire l'app di questo fornitore da un programma separato, quindi odio disturbare il fornitore con il problema se esiste una soluzione alternativa che posso implementare qui sul mio computer server.Inoltre, ho un po' di fretta e non voglio aspettare 4 o 6 mesi affinché il fornitore inserisca una correzione e distribuisca una nuova versione.

Grazie per ogni consiglio che potrai dare.

È stato utile?

Soluzione

Mi sembra che avete problema di permessi. Sembra che l'applicazione .NET tenta di utilizzare un oggetto COM e non ha abbastanza il permesso di farlo.

Ogni oggetto COM (server COM) ha lanciato / attivazione e l'autorizzazione di accesso (solo iniziare dcomcnfg e guardare la configurazione DCOM di alcune applicazioni ben note). Per quanto riguarda di dcomcnfg (Servizi componenti) è possibile non solo vedere, ma anche cambiare questo i permessi (selezionare le proprietà finestra di dialogo Apri nel menu di scelta rapida delle applicazioni e. Quindi scegliere scheda "Protezione", selezionare Personalizza nella "Permesso di esecuzione e attivazione" di blocco e quindi fare clic su "Modifica"). tipico problema è che gli utenti interattivi hanno permesso di lancio / attivazione per il maggior numero di oggetti COM, ma i processi in esecuzione come servizio non sono un membro di questo gruppo. Quindi bisogna personalizzare il permesso con la concessione di un qualche conto (utilizzato dal server web Apache) o un gruppo (come un IIS_IUSRS) la stessa autorizzazione di avvio che ha utenti interattivi. Queste informazioni autorizzazione verrà salvato in una sottochiave della chiave HKEY_CLASSES_ROOT\AppID (vedi valore del Registro AccessPermission binario).

Per identificare l'oggetto COM che fa problema ti consiglio di Process Monitor (si veda http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx ) e Process Explorer (si veda http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx ). Process Monitor può ti aiuta a scoprire esattamente quali altri processi del programma ($vendorsExecutable) tenta di avviare. Uno degli ultimi accessi a HKEY_CLASSES_ROOT vengono utilizzati per avviare un oggetto COM. Potrai scoprire quale processo è. Non dimenticare di avviare questo strumento con un account con diritti amministrativi completi (su un server di tale problema in genere non esiste). Per trovare le informazioni di cui avete bisogno in modo più rapido utilizzare il filtro ad un nome di processo e la ricerca caratteristiche di Process Monitor.

Se fai questo lavoro alla prima volta può sembrare molto complessa. Non è facile, ma tutto ha ben definito logica e sono sicuro, che a risolvere questo problema.

Altri suggerimenti

La causa tipica è che non è stato installato un prerequisito. E 'difficile dire quale, perché le classi COM sono utilizzati da molte applicazioni.

Un modo per scoprire la classe mancante è lo strumento di Sysinternals monitor di processo . Può essere utilizzato per montior utilizzo Registro di sistema. Ciò consente di tenere traccia esattamente quale classe lo script sta tentando di caricare. classi COM Named risiedono in

HKEY_LOCAL_MACHINE\SOFTWARE\Classes

e il loro ingresso GUID di fondo è in

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID

Se Apache è alla ricerca di una voce lì, ma non lo trova, che potrebbe essere la classe COM lo script perl manca.

Per favore dimmi se questo aiuta: Viene visualizzato il messaggio di errore "0x80040154 (classe non registrata)" quando si registra un server ATL

A seconda degli strumenti che il fornitore ha sviluppato per la sua applicazione, la causa potrebbe essere la registrazione di una DLL, che in realtà non è registrata sul tuo Windows Server 2003.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top