private static bool WriteCredential(string key, 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 cred = new CredUi.Credential();
cred.TargetName = key;
cred.UserName = userName;
cred.CredentialBlob = secret;
cred.CredentialBlobSize = (UInt32)Encoding.Unicode.GetBytes(secret).Length;
cred.AttributeCount = 0;
cred.Attributes = IntPtr.Zero;
cred.Comment = null;
cred.TargetAlias = null;
cred.Type = CredUi.CredTypes.CRED_TYPE_GENERIC;
cred.Persist = CredUi.IsWindowsVistaOrEarlier ? CredUi.CredPersistance.Session : CredUi.CredPersistance.LocalMachine;
var ncred = CredUi.NativeCredential.GetNativeCredential(cred);
var written = CredUi.CredWrite(ref ncred, 0);
var lastError = Marshal.GetLastWin32Error();
if (!written)
{
var message = string.Format("CredWrite failed with the error code {0}.", lastError);
throw new CredentialException(lastError, message);
}
return(true);
}