public void TestGetCredential()
        {
            // Arrange
            string            expectedNamespace   = "LegacyGeneric";
            string            expectedAttribute   = "target";
            string            expectedTargetAlias = string.Empty;
            string            expectedTargetName  = "Unit Test Demo";
            CredentialType    expectedType        = CredentialType.Generic;
            CredentialPersist expectedPersist     = CredentialPersist.LocalMachine;
            string            expectedUsername    = "******";
            string            expectedPassword    = "******";
            PSCredential      expectedCredential  = new PSCredential(expectedUsername, CredentialHelper.StringToSecureString(expectedPassword));

            // Act
            CredentialEntry actualCredentialEntry = CredentialStore.GetCredential(expectedTargetName, expectedType);

            // Assert
            Assert.AreEqual(expectedNamespace, actualCredentialEntry.Namespace);
            Assert.AreEqual(expectedAttribute, actualCredentialEntry.Attribute);
            Assert.AreEqual(expectedTargetAlias, actualCredentialEntry.TargetAlias);
            Assert.AreEqual(expectedTargetName, actualCredentialEntry.TargetName);
            Assert.AreEqual(expectedType, actualCredentialEntry.Type);
            Assert.AreEqual(expectedPersist, actualCredentialEntry.Persist);
            Assert.AreEqual(expectedUsername, actualCredentialEntry.Credential.UserName);
            Assert.AreEqual(expectedPassword, actualCredentialEntry.Credential.GetNetworkCredential().Password);
        }
示例#2
0
        /// <summary>
        /// Check if we can persist credentials to for the current process and logon session.
        /// </summary>
        /// <returns>True if persistence is possible, false otherwise.</returns>
        public static bool CanPersist()
        {
            uint count = Advapi32.CRED_TYPE_MAXIMUM;
            var  arr   = new CredentialPersist[count];

            int result = Win32Error.GetLastError(
                Advapi32.CredGetSessionTypes(count, arr)
                );

            CredentialPersist persist = CredentialPersist.None;

            if (result == Win32Error.Success)
            {
                persist = arr[(int)CredentialType.Generic];
            }

            // If the maximum allowed is anything less than "local machine" then cannot persist credentials.
            return(persist >= CredentialPersist.LocalMachine);
        }
        /// <summary>
        /// Create a new credential entry objects.
        /// </summary>
        /// <param name="targetName">Credential entry name.</param>
        /// <param name="type">Credential entry type.</param>
        /// <param name="persist">Credential entry persist.</param>
        /// <param name="credential">Credential object.</param>
        /// <returns>Returns the new created entry.</returns>
        public static CredentialEntry CreateCredential(string targetName, CredentialType type, CredentialPersist persist, PSCredential credential)
        {
            NativeMethods.Credential nativeCredential = new NativeMethods.Credential()
            {
                TargetName         = targetName,
                Type               = (NativeMethods.CredentialType)type,
                Persist            = (NativeMethods.CredentialPersist)persist,
                AttributeCount     = 0,
                UserName           = credential.UserName,
                CredentialBlob     = Marshal.StringToCoTaskMemUni(credential.GetNetworkCredential().Password),
                CredentialBlobSize = (uint)Encoding.Unicode.GetByteCount(credential.GetNetworkCredential().Password)
            };

            try
            {
                if (NativeMethods.CredWrite(ref nativeCredential, 0))
                {
                    return(GetCredential(targetName, type));
                }
                else
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
            }
            finally
            {
                if (nativeCredential.CredentialBlob != IntPtr.Zero)
                {
                    Marshal.FreeCoTaskMem(nativeCredential.CredentialBlob);
                }
            }
        }