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