/// <summary> /// Create a new CredentialEntry object. /// </summary> /// <param name="nativeCredential">The native credential object.</param> /// <param name="flags">Credential object flags.</param> internal CredentialEntry(NativeMethods.Credential nativeCredential, NativeMethods.CredentialEnumerateFlags flags) { // Initialize default properties Namespace = string.Empty; Type = (CredentialType)nativeCredential.Type; Persist = (CredentialPersist)nativeCredential.Persist; TargetName = nativeCredential.TargetName ?? string.Empty; Username = nativeCredential.UserName ?? string.Empty; Password = CredentialHelper.IntPtrToSecureString(nativeCredential.CredentialBlob, nativeCredential.CredentialBlobSize); Comment = nativeCredential.Comment ?? string.Empty; Attribute = string.Empty; TargetAlias = nativeCredential.TargetAlias ?? string.Empty; // Extract namespace, attribute and target name if (flags == NativeMethods.CredentialEnumerateFlags.AllCredentials) { Match match = Regex.Match(TargetName, "(.*?):(.*?)=(.*)"); if (match.Success) { if (match.Groups.Count >= 2) { Namespace = match.Groups[1].Value; } if (match.Groups.Count >= 3) { Attribute = match.Groups[2].Value; } if (match.Groups.Count >= 4) { TargetName = match.Groups[3].Value; } } } // Use the username if provided or fallback to the target name if (!string.IsNullOrEmpty(Username)) { Credential = new PSCredential(Username, Password); } else { Credential = new PSCredential(TargetName, Password); } }
/// <summary> /// Get all credential entries matching the specified parameters. /// </summary> /// <param name="targetName">Optional entry name.</param> /// <param name="type">Optional entry type.</param> /// <param name="persist">Optional entry persist.</param> /// <param name="username">Optional entry username.</param> /// <returns>List of al matching credential entries.</returns> public static IEnumerable <CredentialEntry> GetCredentials(string targetName = null, CredentialType?type = null, CredentialPersist?persist = null, string username = null) { IList <CredentialEntry> credentials = new List <CredentialEntry>(); int count; IntPtr credentialArrayPtr; NativeMethods.CredentialEnumerateFlags flags = NativeMethods.CredentialEnumerateFlags.None; if (Environment.OSVersion.Version.Major >= 6) { flags = NativeMethods.CredentialEnumerateFlags.AllCredentials; } if (NativeMethods.CredEnumerate(null, flags, 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 nativeCredential = Marshal.PtrToStructure <NativeMethods.Credential>(credentialPtr); CredentialEntry credential = new CredentialEntry(nativeCredential, flags); if ((string.IsNullOrEmpty(targetName) || credential.TargetName == targetName) && (!type.HasValue || credential.Type == type.Value) && (!persist.HasValue || credential.Persist == persist.Value) && (string.IsNullOrEmpty(username) || credential.Credential.UserName == username)) { credentials.Add(credential); } } } } else { throw new Win32Exception(Marshal.GetLastWin32Error()); } return(credentials); }