CredRead() не работает между сеансами входа в систему

Я использую 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() в этой статьи.


person Gigi    schedule 20.03.2014    source источник


Ответы (1)


Вы можете настроить сохранение учетных данных, задав свойство Persist.

Из MSDN (http://msdn.microsoft.com/en-us/library/windows/desktop/aa374788(v=vs.85).aspx)

CRED_PERSIST_SESSION
CRED_PERSIST_LOCAL_MACHINE
CRED_PERSIST_ENTERPRISE
person meziantou    schedule 20.03.2014