private static IReadOnlyCollection <Credential> Enumerate(string filter, CredEnumerateFlags flags = 0x0) { List <Credential> Results = new List <Credential>(); UInt32 Count = 0; IntPtr Credentials = IntPtr.Zero; bool Success = CredEnumerate(filter, (UInt32)flags, out Count, out Credentials); if (Success) { for (int i = 0; i < Count; i++) { IntPtr CredPtr = Marshal.ReadIntPtr(Credentials, i * Marshal.SizeOf <IntPtr>()); CREDENTIAL Cred = Marshal.PtrToStructure <CREDENTIAL>(CredPtr); Results.Add(Credential.FromWin32Credential(Cred)); } CredFree(Credentials); return(Results); } else { ThrowLastWin32Error(); return(null); } }
public static extern bool CredEnumerate(string filter, CredEnumerateFlags flag, out int count, out IntPtr pCredentials);
public static IDisposableGetter <IEnumerable <Credential> > Enumerate(string Filter = null, CredEnumerateFlags CredFlags = default(CredEnumerateFlags)) { var Size = Marshal.SizeOf(typeof(IntPtr)); if (Interop.CredEnumerate(Filter, CredFlags, out var count, out var pCredentials)) { return(new CriticalCredGetterHandle <IEnumerable <Credential> >(pCredentials, p => Froms(count, p))); } var hresult = Marshal.GetHRForLastWin32Error(); var exception = Marshal.GetExceptionForHR(hresult); if (unchecked ((uint)hresult) == 0x80070032) { throw new NotSupportedException("not support.", exception); } throw exception; }