Я использую Credential Manager API в соответствии с этим ответом. Цитирование соответствующего фрагмента кода:
public static Credential ReadCredential(string applicationName)
{
IntPtr nCredPtr;
bool read = CredRead(applicationName, CredentialType.Generic, 0, out nCredPtr);
if (read)
{
using (CriticalCredentialHandle critCred = new CriticalCredentialHandle(nCredPtr))
{
CREDENTIAL cred = critCred.GetCredential();
return ReadCredential(cred);
}
}
return null;
}
Это прекрасно работает, за исключением того, что когда я выхожу из своей учетной записи Windows, а затем снова вхожу в систему, CredRead() возвращает false, а Marshal.GetLastWin32Error()
дает мне 1168
или ERROR_NOT_FOUND
.
Почему такое поведение? Работает ли Credential Management API только для текущего сеанса или я что-то делаю не так?
Изменить: комментарий под этот вопрос говорит, что:
Документы для API управления учетными данными, по-видимому, указывают, что эти учетные данные связаны с сеансом входа в систему. Возможно, LogonUser приводит к новому сеансу входа в систему, поэтому учетные данные там не существуют.
Однако я еще не нашел никаких доказательств того, что управление учетными данными зависит от сеанса. Я думаю, что это было бы довольно бесполезно, если бы это было так.
Редактировать 2. Просто для записи: если вам нужно получить номер ошибки, указывающий, почему CredRead() не работает, проверьте метод ReadCred() в этой статьи.