/// <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);
        }