CredEnumerate не работает для текущего пользователя - PullRequest
0 голосов
/ 09 октября 2019

Я использую API Credential Manager согласно этому ответу Шифрование учетных данных в приложении WPF . Я использую enumerateCredentials, чтобы получить список всех учетных данных в диспетчере учетных данных Windows.

Добавление фрагмента кода:

 public static IReadOnlyList<Credential> EnumerateCrendentials()
    {
        List<Credential> result = new List<Credential>();

        int count;
        IntPtr pCredentials;
        bool ret = CredEnumerate(null, 1, out count, out pCredentials);

        if (ret)
        {
            for (int n = 0; n < count; n++)
            {
                IntPtr credential = Marshal.ReadIntPtr(pCredentials, n * Marshal.SizeOf(typeof(IntPtr)));
                result.Add(ReadCredential((CREDENTIAL)Marshal.PtrToStructure(credential, typeof(CREDENTIAL))));
            }
        }
        else
        {
            int lastError = Marshal.GetLastWin32Error();
            throw new Win32Exception(lastError);
        }

        return result;
    }

    [DllImport("Advapi32.dll", EntryPoint = "CredReadW", CharSet = CharSet.Unicode, SetLastError = true)]
    static extern bool CredRead(string target, CredentialType type, int reservedFlag, out IntPtr credentialPtr);

    [DllImport("Advapi32.dll", EntryPoint = "CredWriteW", CharSet = CharSet.Unicode, SetLastError = true)]
    static extern bool CredWrite([In] ref CREDENTIAL userCredential, [In] UInt32 flags);

    [DllImport("advapi32", SetLastError = true, CharSet = CharSet.Unicode)]
    static extern bool CredEnumerate(string filter, int flag, out int count, out IntPtr pCredentials);

Когда я выполняю приведенный выше код, я могу получить всесохраненные учетные данные Windows. Но когда я запускаю консольное приложение после создания исполняемого файла релиза, оно возвращает только одно удостоверение.

Почему это поведение? Использует ли диспетчер учетных данных учетные данные пользователя при запуске из Visual Studio в режиме отладки?

В документации упоминается, что

Функция CredEnumerate перечисляет учетные данные изнабор учетных данных пользователя. Используется набор учетных данных, связанный с сеансом входа в систему текущего токена. Токен не должен иметь SID пользователя отключенным.

Как я могу запустить его? Есть ли другой способ получить только имя приложения и имя пользователя, сохраненные в моих учетных данных Windows?

...