【发布时间】:2011-07-02 10:56:17
【问题描述】:
问题
我不知道要弄清楚会这么难,但我在这里。
我正在开发一个网络支持客户端,它必须检测当前登录的用户是否设置了密码。我尝试使用 WMI 检查Win32_UserAccount 类中的PasswordRequired 属性,但即使我的帐户受密码保护,它也会返回false。我没有想法......
(背景:我需要此信息来告诉用户他必须设置一个,以便我可以通过远程桌面连接到他,如果帐户“不受保护”,这不是很高兴。如果有办法获得围绕这个我也接受不同的解决方案。)
此致
奈法瑞斯
解决方案
比我想象的要容易,我使用 WinAPI 函数 LogonUser 管理它,并为您提供这个简单的包装代码:
private bool PasswordRequired
{
get
{
IntPtr phToken;
// http://www.pinvoke.net/default.aspx/advapi32/LogonUser.html
bool loggedIn = LogonUser(Environment.UserName,
null,
"",
(int)LogonType.LOGON32_LOGON_INTERACTIVE,
(int)LogonProvider.LOGON32_PROVIDER_DEFAULT,
out phToken);
int error = Marshal.GetLastWin32Error();
if (phToken != IntPtr.Zero)
// http://www.pinvoke.net/default.aspx/kernel32/CloseHandle.html
CloseHandle(phToken);
// 1327 = empty password
if (loggedIn || error == 1327)
return false;
else
return true;
}
}
这正是我所需要的,感谢大家快速而有能力的回答,我永远可以信赖你们! =)
【问题讨论】:
-
嗨 Nefarius,我认为这将是一种奇怪的解决问题的方法。也许您可以简单地检测帐户是否处于活动状态(例如未禁用) - 但确定密码是否设置确实是不可能的,这将允许其他人获取密码信息......您可能还想检查任何密码策略系统...
-
这是针对您自己的域/工作网络的吗?
-
是的,是的。我会将我的工具以存档文件的形式发送给有问题的人,他只需启动它,它就会为传入的终端服务器连接请求做好系统准备。
-
1327 is ERROR_ACCOUNT_RESTRICTION, documented as "帐户限制阻止此用户登录。例如:不允许使用空白密码、限制登录时间或已受到政策限制强制执行。”似乎除了空白密码之外还有其他情况会产生此错误代码,但很难知道它们是什么。