C#身份模拟报错‘用户名或密码不正确’:参数配置及排查
Windows身份模拟报错排查:用户名或密码不正确
问题代码
// ------------------------------------------------------------------ /// <summary> /// Does the actual impersonation. /// </summary> /// <param name="userName">The name of the user to act as.</param> /// <param name="domainName">The domain name of the user to act as.</param> /// <param name="password">The password of the user to act as.</param> private void ImpersonateValidUser( string userName, string domain, string password ) { WindowsIdentity tempWindowsIdentity = null; IntPtr token = IntPtr.Zero; IntPtr tokenDuplicate = IntPtr.Zero; try { if ( RevertToSelf() ) { if ( LogonUser( userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token ) != 0 ) { if ( DuplicateToken( token, 2, ref tokenDuplicate ) != 0 ) { tempWindowsIdentity = new WindowsIdentity( tokenDuplicate ); impersonationContext = tempWindowsIdentity.Impersonate(); } else { throw new Win32Exception( Marshal.GetLastWin32Error() ); } } else { throw new Win32Exception( Marshal.GetLastWin32Error() ); } } else { throw new Win32Exception( Marshal.GetLastWin32Error() ); } } finally { if ( token!= IntPtr.Zero ) { CloseHandle( token ); } if ( tokenDuplicate!=IntPtr.Zero ) { CloseHandle( tokenDuplicate ); } } }
问题描述
使用上述代码执行身份模拟时,传入参数如下:
userName:目标访问机器的账号domain:目标访问机器的IPpassword:目标访问机器的密码
运行后报错:The user name or password is incorrect,需排查参数配置是否正确,以及其他需要调整的地方。
排查与调整方案
1. 参数配置错误修正
- domain参数不能填IP:如果目标机器属于工作组环境,
domain参数应传入目标机器的计算机名,而非IP地址。若目标机器加入域,则需传入域名;若要登录本地机器,可传.表示本地,但远程场景必须传目标机器的计算机名。 - 用户名格式可选方案:也可以将用户名格式设为
机器名\用户名,此时domain参数传空字符串或.,同样能完成验证。
2. LogonUser参数调整
- 登录类型替换:当前使用的
LOGON32_LOGON_INTERACTIVE(交互式登录)并不适合远程资源访问场景,建议替换为:LOGON32_LOGON_NETWORK(值为3):适用于网络资源访问的登录类型,验证逻辑更匹配远程场景LOGON32_LOGON_NEW_CREDENTIALS(值为9):适合跨域或远程资源访问,会创建包含新凭据的登录会话
- 登录提供者调整:将
LOGON32_PROVIDER_DEFAULT替换为LOGON32_PROVIDER_WINNT50(值为3),部分环境下默认提供者无法正确处理远程登录验证。
3. 其他检查项
- 目标机器账号权限:确认目标机器的用户账号已开启「允许远程登录」权限(可在「本地用户和组」→ 用户属性中配置)。
- 密码正确性:检查密码是否存在大小写错误、特殊字符转义问题,确保传入的密码字符串未被截断或修改。
- 网络与防火墙:验证本地机器与目标机器网络连通(能正常ping通),且防火墙未阻挡远程访问相关端口(如SMB协议的445端口)。
- 本地进程权限:确保运行当前程序的账号具备调用
LogonUser的权限,建议以管理员身份启动程序。
4. 代码细节优化
- 确保
RevertToSelf()调用成功:该方法用于恢复到进程自身身份,若之前存在未释放的模拟上下文,需先确保恢复操作成功再执行新的模拟。 - Token释放逻辑:当前代码的finally块已正确处理Token释放,需保持该逻辑避免资源泄漏。
内容的提问来源于stack exchange,提问作者adam
相关产品推荐
相关产品推荐

