private static AutoRohlikovac.Credential ReadCredential(Credential credential) { var applicationName = Marshal.PtrToStringUni(credential.TargetName); var userName = Marshal.PtrToStringUni(credential.UserName); string secret = null; if (credential.CredentialBlob != IntPtr.Zero) { secret = Marshal.PtrToStringUni(credential.CredentialBlob, (int) credential.CredentialBlobSize/2); } return new AutoRohlikovac.Credential(credential.Type, applicationName, userName, secret); }
public static int WriteCredential(string applicationName, string userName, string secret) { var byteArray = Encoding.Unicode.GetBytes(secret); if (byteArray.Length > 512) throw new ArgumentOutOfRangeException(secret, @"The secret message has exceeded 512 bytes."); var credential = new Credential { AttributeCount = 0, Attributes = IntPtr.Zero, Comment = IntPtr.Zero, TargetAlias = IntPtr.Zero, Type = CredentialType.Generic, Persist = (uint) CredentialPersistence.LocalMachine, CredentialBlobSize = (uint) Encoding.Unicode.GetBytes(secret).Length, TargetName = Marshal.StringToCoTaskMemUni(applicationName), CredentialBlob = Marshal.StringToCoTaskMemUni(secret), UserName = Marshal.StringToCoTaskMemUni(userName ?? Environment.UserName) }; var written = CredWrite(ref credential, 0); var lastError = Marshal.GetLastWin32Error(); Marshal.FreeCoTaskMem(credential.TargetName); Marshal.FreeCoTaskMem(credential.CredentialBlob); Marshal.FreeCoTaskMem(credential.UserName); if (written) return 0; throw new Exception($"CredWrite failed with the error code {lastError}."); }