2012-08-29 7 views
5

Scrivo un servizio Windows in python e sto utilizzando il modulo keyring per archiviare in modo sicuro le credenziali che devo utilizzare regolarmente e in modo permanente. Ciò significa che il keyring memorizza le password utilizzando le credenziali dell'utente del sistema locale.Errore 1312 durante l'utilizzo del portachiavi Python su Windows Server 2003

Tutto ciò che faccio è utilizzare le 2 funzioni di base dei tasti: get_password(SERVICE_NAME, username, password) e set_password(SERVICE_NAME, username). Non ho preconfigurato il portachiavi come l'ho capito e ho visto che configura automaticamente il suo back-end.

Quando si esegue questo in Windows Server 2008 e versioni successive, tutto funziona correttamente. Ma quando ho eseguito questo su Windows Server 2003, ottengo questo brutto errore:

error: (1312, 'CredWrite', 'A specified logon session does not exist. It may already have been terminated.')

suppongo che abbia qualcosa a che fare con la sessione di accesso dell'utente del sistema locale che viene utilizzato per eseguire il mio servizio, anche se è strano dal momento che ho capito che è una forma di ultra-admin-super-utente che dovrebbe avere i permessi per fare tutto ciò che vuole nel sistema. Ma quando cambio le credenziali di accesso dell'utente all'amministratore locale, tutto funziona perfettamente.

C'è qualcosa che devo cambiare nella configurazione del mio servizio affinché funzioni? O modificare le politiche di sicurezza dell'utente di sistema locale? O dovrei chiedere agli utenti di eseguire questo servizio con le credenziali dell'amministratore locale?

risposta

3

Sembra che vi sia una limitazione per l'utente del sistema locale in Windows Server 2003 che non ha accesso al meccanismo di Windows di salvataggio delle credenziali noto anche come Credential Vault.

Il backend predefinito di keyring per Windows è quello di utilizzare questo meccanismo di Windows Vault incorporato, ed è questo che crea ciò che attiva questa eccezione da Windows.

La soluzione a questo problema è quello di utilizzare un diverso portachiavi backend chiamato Win32CryptoKeyring piace così:

keyring.set_keyring(keyring.backend.Win32CryptoKeyring()) 

Questo backend utilizza l'API Win32 Cryptographic per salvare in modo sicuro le credenziali, quindi la sicurezza-saggio è sicuro come utilizzare il meccanismo di Windows Vault. La differenza è solo la posizione in cui vengono salvate le credenziali. Non sono sicuro di dove siano state salvate le credenziali, ma ciò è risultato irrilevante per il mio caso.

È importante notare ancora una volta che questo errore si verifica solo con la combinazione dell'utilizzo di Windows Vault dall'utente del sistema locale in Windows Server 2003. Nelle versioni di Windows più recenti funziona perfettamente e con altri utenti su Windows Server 2003 funziona anche perfettamente.

L'utilizzo del backend Win32CryptoKeyring nelle versioni più recenti di Windows funziona perfettamente anche se si desidera utilizzare più piattaforme senza utilizzare più di un meccanismo protetto per il salvataggio delle credenziali nel codice.

+0

Ciao Avihu, questa è la cosa più vicina che ho trovato per il mio problema. Sto usando Golang. Quando eseguo il mio programma go in windows localmente, funziona perfettamente. Ma quando eseguo l'accesso al server Cygwin da un altro sistema ed eseguo il programma, esso fornisce il problema esatto che stai affrontando. Potresti indirizzarmi nella giusta direzione quale potrebbe essere il problema? Ho chiesto una questio qui: https://serverfault.com/questions/884269/a-specified-logon-session-does-not-exist-it-may-already-have-been-terminated-o – pinkpanther