private CredEnumerate ( string targetNameFilter, CredentialEnumerateFlags flags, int &count, |
||
targetNameFilter | string | |
flags | CredentialEnumerateFlags | |
count | int | |
credenitalsArrayPtr | ||
Результат | bool |
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); } }
protected void PurgeCredentials(string @namespace) { string filter = @namespace + "*"; int count; IntPtr credentialArrayPtr; if (NativeMethods.CredEnumerate(filter, 0, out count, out credentialArrayPtr)) { 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 credential = Marshal.PtrToStructure <NativeMethods.Credential>(credentialPtr); if (!NativeMethods.CredDelete(credential.TargetName, credential.Type, 0)) { int error = Marshal.GetLastWin32Error(); Debug.Fail("Failed with error code " + error.ToString("X")); } } } NativeMethods.CredFree(credentialArrayPtr); } else { int error = Marshal.GetLastWin32Error(); Debug.Fail("Failed with error code " + error.ToString("X")); } }
protected IEnumerable <Secret> EnumerateCredentials(string @namespace) { string filter = @namespace ?? 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 = (int)credStruct.CredentialBlobSize; string password = passwordLength > 0 ? Marshal.PtrToStringUni(credStruct.CredentialBlob, passwordLength / sizeof(char)) : string.Empty; string username = credStruct.UserName ?? string.Empty; var credentials = new Credential(username, password); yield return(credentials); } } } finally { NativeMethods.CredFree(credentialArrayPtr); } }