含希腊字符密码下LogOnUser() API调用失败问题咨询
这个问题我之前帮开发者排查过类似的,先给你明确结论:你用的希腊语密码Σιεμενσ123!本身没有无效字符——Windows完全支持Unicode字符作为密码,包括希腊字母。报错ERROR_LOGON_FAILURE(1326)的核心原因几乎都是API调用时的编码处理错误,而非字符本身的问题。
下面是具体的解决方案建议:
务必使用宽字符版本的LogOnUser API
Windows API分ANSI(LogOnUserA)和宽字符(LogOnUserW)两个版本。ANSI版本会强制把Unicode密码转成系统默认编码(比如中文系统是GBK),希腊字母不在这个编码范围内,会被转成问号或其他无效字符,直接导致登录失败。你必须调用LogOnUserW,并确保传递的密码是宽字符格式(比如C++里的wchar_t*,C#里直接用string并在P/Invoke声明中指定CharSet.Unicode)。验证代码中的字符串编码传递
以C#的P/Invoke声明为例,正确的写法应该是这样:[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] public static extern bool LogOnUser( string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);这里的
CharSet.Unicode是关键,它确保.NET把字符串以UTF-16宽字符格式传递给API,彻底避免编码丢失的问题。排查输入与存储的字符一致性
有时候输入法的细微差异会导致看似相同的字符实际编码不同(比如希腊字母的变体字符,或者全角/半角符号)。你可以把设置密码时的字符串和登录时输入的字符串,分别转成Unicode码点对比,确认每个字符的码值完全一致:- Σ的码点是
U+03A3 - ι的码点是
U+03B9 - ε的码点是
U+03B5 - μ的码点是
U+03BC - ν的码点是
U+03BD - σ的码点是
U+03C3
- Σ的码点是
检查账户状态与API参数正确性
除了编码问题,还要排除基础配置错误:- 确认目标账户没有被锁定或禁用
- 调用API时的
dwLogonType和dwLogonProvider参数符合你的场景(比如本地交互式登录用LOGON32_LOGON_INTERACTIVE和LOGON32_PROVIDER_DEFAULT) - 如果是本地账户,域名参数要传
".\"或者机器名,不要留空(部分场景下空域名会导致账户解析错误)
内容的提问来源于stack exchange,提问作者WPF Learner

