调用Windows安全中心实现登录验证

运行效果

Win10风格
XP风格

输入用户名和密码点击确定后获取到的信息:
打印信息

用到的运行库

NuGet搜索安装即可

  • Kang.ExtendMethod
  • Kang.ExtendMethod.Log

https://gitee.com/haozekang/kang

  • Vanara.PInvoke

https://github.com/dahall/Vanara/

代码实现

使用日志

readonly Logger logger = LogManager.GetCurrentClassLogger();

Win10 Flat风格

CredUI.CREDUI_INFO info = new CredUI.CREDUI_INFO();
info.pszCaptionText = "登录大伽";
info.pszMessageText = "欢迎使用大伽智能病理系统";
info.cbSize = Marshal.SizeOf(info);
uint pulAuthPackage = 0, ulInAuthBufferSize = 0, pulOutAuthBufferSize;
IntPtr pvInAuthBuffer = IntPtr.Zero, ppvOutAuthBuffer = IntPtr.Zero, pAuthBuffer = IntPtr.Zero;
bool isSave = false;
int maxUnSize = 50, maxPwSize = 50, maxDomSize = 50;
StringBuilder un = new StringBuilder(maxUnSize), pw = new StringBuilder(maxPwSize), dom = new StringBuilder(maxDomSize);

var error = CredUI.CredUIPromptForWindowsCredentials(info, Win32Error.NO_ERROR, ref pulAuthPackage, pvInAuthBuffer, ulInAuthBufferSize, out ppvOutAuthBuffer, out pulOutAuthBufferSize, ref isSave, CredUI.WindowsCredentialsDialogOptions.CREDUIWIN_GENERIC);
if (error == Win32Error.ERROR_CANCELLED)
{
    logger.Debug($"{error}");
    return;
}
if (error != Win32Error.ERROR_SUCCESS)
{
    logger.Debug($"{error}");
    return;
}
var flag = CredUI.CredUnPackAuthenticationBuffer(CredUI.CredPackFlags.CRED_PACK_GENERIC_CREDENTIALS, ppvOutAuthBuffer, (int)pulOutAuthBufferSize, un, ref maxUnSize, dom, ref maxDomSize, pw, ref maxPwSize);
if (un.ToString().IsBlank())
{
    logger.Debug($"用户名不能为空!");
    return;
}
if (pw.ToString().IsBlank())
{
    logger.Debug($"密码不能为空!");
    return;
}
if (!flag)
{
    logger.Debug($"获取用户名及密码信息失败!");
    return;
}
logger.Debug($"用户名:{un}    密码:{pw}");

XP风格

CredUI.CREDUI_INFO info = new CredUI.CREDUI_INFO();
info.pszCaptionText = "登录大伽";
info.pszMessageText = "欢迎使用大伽智能病理系统";
info.cbSize = Marshal.SizeOf(info);
IntPtr Reserved = IntPtr.Zero;
bool isSave = false;
int maxUnSize = 50, maxPwSize = 50;
StringBuilder un = new StringBuilder(maxUnSize), pw = new StringBuilder(maxPwSize);

var error = CredUI.CredUIPromptForCredentials(info, "www.dakapath.com/dakapath", Reserved, Win32Error.NO_ERROR, un, 10, pw, 10, ref isSave, CredUI.CredentialsDialogOptions.CREDUI_FLAGS_DEFAULT);

总结

  1. Win10风格的那个,取到的不是明文,是一个加密后的Pack,需要使用Windows自带的方法进行解密才可以拿到真实的用户名和密码,而XP风格的那个,是直接取到明文;
  2. 不想画登录界面的,对登录界面要求比较简单,又想自己的程序登录起来有点逼格的可以用Win10的那个(⊙o⊙)…;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0564丶Kang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值