Ho un fornitore di terze parti che sta installando una serie di servizi Windows su un server (Windows 2008 R2) nel mio controllo. Mentre tentiamo di eseguire ciascun servizio con il suo account con privilegi minimi, abbiamo riscontrato problemi di permessi obbligatori. Questi sembrano essere risolvibili solo eseguendo il servizio come sistema locale - anche l'appartenenza al gruppo Administrators locale è insufficiente.
Il problema sembra derivare da un codice relativo a IPC, che è costruito attorno a una singola classe .NET, a cui fanno riferimento i singoli servizi.
Per quanto posso dire dallo smontaggio di IL (tramite Telerik JustDecompile), la classe IPC deriva da System.Windows.Forms.NativeWindow
e imposta una sovrascrittura WndProc
per gestire un messaggio personalizzato.
Ogni servizio crea un'istanza della classe IPC con un parametro name
, che passa come title di NativeWindow e, quando è necessario inviare all'altro servizio, utilizza l'API Win32 FindWindow
metodo (chiamato come Win32.FindWindow(null, targetName)
) per determinare l'handle del NativeWindow nascosto del servizio di destinazione e chiama PostMessage
su quell'handle per attivare l'azione remota.
Il problema sembra essere che, a meno che non venga eseguito come Sistema locale, la chiamata a FindWindow
restituisce solo un punto zero, che il servizio di invio percepisce come il servizio di destinazione non trovato. Come accennato, anche se eseguito come membro degli amministratori, sembra ancora che restituisca il valore zero.
Ho pensato che questo potrebbe essere un problema con l'isolamento della sessione n. 0 ma, poiché questo è tutto IPC servizio-di-servizio, piuttosto che servizio-desktop, tutti gli eseguibili sono comunque in esecuzione nella Sessione # 0.
Non c'è molto che potrò fare al riguardo - le esigenze aziendali devono, dopo tutto - ma, da una prospettiva teorica:
-
Ho ragione nel pensare che un globale, chiamato
EventWaitHandle
, con un ciclo di messaggiwhile (true) { _h.WaitOne(); /* handle event */ }
-style, sul proprio thread, sia l'opzione più appropriata per questo tipo di lavoro? -
Si tratta di un caso di permessi per l'handle della finestra (esistono cose simili?) e, in caso affermativo, potrebbero essere modificati (ad es. con
DuplicateHandle
); o esiste un privilegio di Windows (ad esempio in Politica di sicurezza locale / Assegnazione diritti utente) che consente / sovrascrive l'accesso all'handle? (Ho considerato SeDebugPrivilege, ma gli amministratori locali già hanno quello.) -
C'è qualcosa che documenta l'inadeguatezza di FindWindow / PostMessage per questo tipo di lavoro (in particolare per l'IPC servizio-servizio)? si tratta di una limitazione nota per FindWindow, con la quale potrei battere la terza parte in testa?