2012-08-29 7 views
5

Piszę usługę Windows w Pythonie i używam modułu kluczy do bezpiecznego przechowywania poświadczeń, które muszę regularnie i uporczywie używać. Oznacza to, że keyring przechowuje hasła przy użyciu poświadczeń użytkownika lokalnego systemu.Błąd 1312 podczas korzystania z Pythona w systemie Windows Server 2003

Wszystko, co robię, to korzystanie z 2 podstawowych funkcji kluczy: get_password(SERVICE_NAME, username, password) i set_password(SERVICE_NAME, username). Nie wstępnie skonfigurowałem breloka, tak jak to rozumiałem, i zobaczyłem, że automatycznie konfiguruje swój backend.

Po uruchomieniu tego w systemie Windows Server 2008 i nowszych wersjach wszystko działa sprawnie. Ale gdy uruchomię to w systemie Windows Server 2003, otrzymuję ten paskudny błąd:

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

Zakładam, że ma coś wspólnego z sesją logowania lokalnego użytkownika systemu, który jest używany do uruchamiania moją służbę, choć jest to osobliwe, ponieważ zrozumiałem, że jest to forma super-super-administratora, która powinna mieć uprawnienia do robienia wszystkiego, co chce w systemie. Ale gdy zmienię poświadczenia logowania użytkownika na lokalnego administratora, wszystko działa sprawnie.

Czy jest coś, co muszę zmienić w konfiguracji mojej usługi, aby to działało? Lub zmienić zasady bezpieczeństwa lokalnego użytkownika systemu? A może powinienem poprosić użytkowników o uruchomienie tej usługi z poświadczeniami lokalnego administratora?

Odpowiedz

3

Wygląda na to, że użytkownik systemu lokalnego ma ograniczenie w systemie Windows Server 2003, że nie ma dostępu do mechanizmu Windows zapisywania poświadczeń, zwanych również skarbcem referencji.

Domyślnym backendem kluczy dla Windows jest użycie tego wbudowanego mechanizmu Windows Vault i właśnie to wywołuje ten wyjątek z Windows.

Rozwiązaniem tego problemu jest zastosowanie innego brelok backend nazywa Win32CryptoKeyring lubi tak:

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

Ten backend używa API Win32 kryptograficzne bezpiecznie zapisać poświadczenia, więc bezpieczeństwo mądry to jest tak bezpieczne, jak za pomocą mechanizm Windows Vault. Różnica dotyczy tylko lokalizacji, do której zapisywane są dane logowania. Nie jestem pewien, gdzie zapisane są dane uwierzytelniające, ale okazało się to nieistotne dla mojej sprawy.

Należy ponownie zauważyć, że ten błąd występuje tylko w połączeniu z korzystaniem z usługi Windows Vault od użytkownika systemu lokalnego w systemie Windows Server 2003. W nowszych wersjach systemu Windows działa to doskonale, a wraz z innym użytkownikiem w systemie Windows Server 2003 to działa również doskonale.

Korzystanie z serwera plików w nowszych wersjach systemu Windows działa również doskonale, jeśli chcesz korzystać z wielu platform bez użycia więcej niż jednego bezpiecznego mechanizmu do zapisywania poświadczeń w kodzie.

+0

Cześć Avihu, to jest najbliższa rzecz, którą znalazłem dla mojego problemu. Używam golang. Kiedy uruchamiam program go w systemie Windows lokalnie, działa dobrze. Ale kiedy przychodzę do serwera cygwin z innego systemu i uruchamiam program, daje to dokładny problem, przed którym stoisz. Czy możesz skierować mnie we właściwym kierunku, co może być problemem? Zapytałem o questio tutaj: https://serverfault.com/questions/884269/a-specified-logon-session-does-not-exist-it-may-already-have-been-terminated-o – pinkpanther

Powiązane problemy