2008-10-20 23 views
7

Ho un pacchetto di installazione che installa un processo di servizio che creo. Vorrei chiedere all'utente il nome utente/password dell'account su cui dovrebbe essere eseguito il processo di servizio. Vorrei verificare che la combinazione nome utente/password sia valida prima di continuare con l'installazione. Ho una DLL C che sto usando per un comportamento di installazione speciale, ma non riesco a capire come usare l'API di Windows per verificare le credenziali di un account. Mi piacerebbe essere in grado di supportare la stessa sintassi del nome account utilizzata dal gestore controllo servizi.Verifica nome utente e password dell'account Windows

risposta

12

La funzione che si desidera utilizzare è LogonUser. Puoi anche essere straordinariamente cool e specificare il flag LOGON32_LOGON_SERVICE che verifica che l'utente disponga delle autorizzazioni appropriate per eseguire un servizio.

+0

Ricorda che nelle versioni precedenti del sistema operativo (Win2K e versioni precedenti) l'API LogonUser() richiede un elevato privilegio ("Agisci come parte del sistema operativo"). –

0

L'ho implementato utilizzando la funzione LogonUser come avete detto (a proposito, questo servizio richiede WinXP SP2 o successivo quindi non sono preoccupato per il problema dei privilegi). Tuttavia, questo non funziona come speravo. Se chiamo QueryServiceConfig, lpServiceStartName è nel formato ". \ Accountname". Se passo questa stringa come a LogonUser, fallisce. Presumo la parte prima che '\' rappresenti la macchina su cui l'utente appartiene?

Inoltre, se chiamo ChangeServiceConfig specificando "LocalSystem" e "" rispettivamente per i parametri lpServiceStartName e lpPassword, questo funziona correttamente. Tuttavia, chiamare LogonUser con questi parametri non funziona.

Mi piacerebbe molto usare la stessa sintassi utilizzata da SCM per i nomi degli account.

+0

Devi dividere il dominio dal nome utente. Il '.' funzionerà come dominio per LogonUser (si associa allo spazio dei nomi di sistema locale), ma è necessario dividere il nome utente completo. – Nick

+0

Inoltre, non è possibile accedere in modo esplicito come LocalSystem utilizzando l'API (per quanto ne so). Dovrai applicare questo caso a un caso speciale e la coppia di altri account predefiniti (che si trovano nello spazio dei nomi NT_AUTHORITY). – Nick

Problemi correlati