internal Credential GetCredential()
{
if (IsInvalid)
{
throw new InvalidOperationException("Invalid CriticalHandle!");
}
// Get the Credential from the mem location
var ncred = (NativeCredential)Marshal.PtrToStructure(handle, typeof(NativeCredential));
// Create a managed Credential type and fill it with data from the native counterpart.
var cred = new Credential();
cred.CredentialBlobSize = ncred.CredentialBlobSize;
cred.UserName = Marshal.PtrToStringUni(ncred.UserName);
cred.TargetName = Marshal.PtrToStringUni(ncred.TargetName);
cred.TargetAlias = Marshal.PtrToStringUni(ncred.TargetAlias);
cred.Type = ncred.Type;
cred.Flags = ncred.Flags;
cred.Persist = (CredPersistance)ncred.Persist;
byte[] encryptedPassword = new byte[ncred.CredentialBlobSize];
Marshal.Copy(ncred.CredentialBlob, encryptedPassword, 0, encryptedPassword.Length);
cred.CredentialBlob = DecryptPassword(encryptedPassword);
return cred;
}