public IEnumerable <SecureData> EnumerateSecureData(string prefix)
{
string filter = prefix ?? string.Empty + "*";
if (NativeMethods.CredEnumerate(filter, 0, out int count, out IntPtr credentialArrayPtr))
{
Trace.WriteLine($"{count} credentials enumerated from secret store.");
try
{
for (int i = 0; i < count; i += 1)
{
int offset = i * Marshal.SizeOf(typeof(IntPtr));
IntPtr credentialPtr = Marshal.ReadIntPtr(credentialArrayPtr, offset);
if (credentialPtr != IntPtr.Zero)
{
NativeMethods.Credential credStruct = Marshal.PtrToStructure <NativeMethods.Credential>(credentialPtr);
int passwordLength = credStruct.CredentialBlobSize;
byte[] data = new byte[credStruct.CredentialBlobSize];
Marshal.Copy(credStruct.CredentialBlob, data, 0, credStruct.CredentialBlobSize);
string name = credStruct.UserName ?? string.Empty;
string key = credStruct.TargetName;
yield return(new SecureData(key, name, data));
}
}
}
finally
{
NativeMethods.CredFree(credentialArrayPtr);
}
}