Utilizzo di FindWindow e handle di finestra all'interno di un servizio di Windows

1

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:

  1. Ho ragione nel pensare che un globale, chiamato EventWaitHandle , con un ciclo di messaggi while (true) { _h.WaitOne(); /* handle event */ } -style, sul proprio thread, sia l'opzione più appropriata per questo tipo di lavoro?

  2. 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.)

  3. 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?

posta jimbobmcgee 26.03.2015 - 22:05
fonte

1 risposta

2

Questa è una normale restrizione nel modello di sicurezza di Windows poiché i servizi NT3.x che solo l'account del servizio locale è autorizzato ad accedere al desktop quando viene eseguito come servizio e ha altre restrizioni quando si seleziona tale opzione.

Su Windows Server dal 2003 circa, esiste anche una politica di interazione del servizio che potrebbe essere necessario regolare. Potrebbe essere necessario riavviare la macchina per prendere questa impostazione. HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Windows NoInteractiveServices = il valore predefinito è 1 fino a win2k3, cambia questo a 0. Su win2k8 + il suo valore predefinito è 0

Questa tecnica qui sotto suggerisce anche un metodo che utilizza pipe denominate per connettere un servizio a un'app di Windows o un'attività in background che può essere eseguita nella sessione di accesso e inviare materiali al servizio attraverso la pipe.

Ecco una technote di Microsoft sull'argomento insieme ad alcune avvertenze: link

C'è un hack del registro se si desidera utilizzare un account specifico ma non si è sicuri che sarà in grado di raggiungere la sessione di qualsiasi utente a meno che non disponga delle autorizzazioni di amministratore, non ho mai testato questo caso d'uso.

HK Local Machine: SYSTEM \ CurrentControlSet \ Services \ your service Chiave="Tipo" Posizione 100h (Se si utilizza la logica 'o' con decimale 256 per impostare il bit)

Credito per questo dettaglio del registro: link

    
risposta data 02.04.2015 - 22:24
fonte

Leggi altre domande sui tag