问题
我不知道这很难解决,但我在这里。
我正在开发一个网络支持客户端,它必须检测当前登录用户是否设置了密码。我尝试使用WMI检查PasswordRequired
类中的Win32_UserAccount
属性,但即使我的帐户 密码保护,它也会返回false
。我没有想法......
(背景:我需要这个信息告诉用户他必须设置一个,以便我可以通过远程桌面连接到他,如果帐户“未受保护”,这不是很高兴。如果有办法获得在此我也接受了不同的解决方案。)
真诚的你 Nefarius
解决方案
比我想象的更容易,我使用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;
}
}
这正是我所需要的,谢谢大家快速而有能力的答案,我总是可以依靠你! =)
答案 0 :(得分:7)
为什么不尝试使用空密码登录用户?
答案 1 :(得分:2)
尝试使用空密码更改密码,如果成功,则表示用户未设置密码。假设域用户和Microsoft帐户始终使用密码保护。对于Microsoft帐户,它将抛出PrincipalOperationException。对于本地用户,如果设置了密码,则会抛出PasswordException。 VB script reference,c# change password
try
{
using (var context = new PrincipalContext(ContextType.Machine))
{
var user = UserPrincipal.FindByIdentity(context, userName);
if (null == user)
{
//not local user, password required
passwordRequired = true;
}
else
{
user.ChangePassword("", "");
}
}
}
catch (PasswordException)
{
//local user password required
passwordRequired = true;
}
catch (PrincipalOperationException)
{
//for Microsoft account, password required
passwordRequired = true;
}
答案 2 :(得分:1)
根据我的发现,Windows不存储用户密码的明文版本。 Windows存储已使用单向加密保护的副本。您可以在LSALogonUser函数的MSDN documentation上找到有关将用户登录到窗口的更多信息。它无法帮助您获取用户密码