知道域管理员的账户密码,怎么将自身进程以某个域用户身份模拟登录?
实验室的一个项目,其中一个功能是输入域控制器名、域管理员账户、密码能够获取所有的域用户、组、共享文件夹信息。用的VC6+ADSI,现在遇到的问题是在获取文件夹的访问控制信息(DACLs)时,如果文件夹的共享里删除了Everyone用户,则获取函数GetFileSecurity或者GetNamedSecurityInfo失败,返回5(拒绝访问),即使以域管理员身份也没办法,只能以某个域用户的身份才能获取(假设一个文件夹至少有一个域用户是有权限的),我可以轮询所有的域用户来尝试获取文件夹信息,关键是怎么以某个域用户的身份来登录?我不知道域用户的密码,也不能重置,我想拿到这个用户的access token。
我针对远程登录有两种办法,第一种是建立磁盘映射,用WNetAddConnection2W,需要知道密码,估计是不可能的
第二种是模拟登录,LogonUser + ImpersonateLoggedOnUser,我觉得获得一个hToken还靠谱一些,有什么办法获得吗?还是有什么别的思路?
BOOL ADDirectorySearch::logOnByUserPassword(CString strDomainName, CString strUserName, CString strPassword)
{
CString strFullUserName = strDomainName + _T("\\") + strUserName;
HANDLE hToken;
BOOL bResult;
bResult = LogonUser(strUserName, strDomainName, strPassword, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_DEFAULT, &hToken);
if (bResult == FALSE)
{
MyMessageBox_Error(_T("logOnByUserPassword Error."), _T("Error"));
return FALSE;
}
else
{
bResult = ImpersonateLoggedOnUser(hToken);
if (bResult == FALSE)
{
MyMessageBox_Error(_T("logOnByUserPassword Error."), _T("Error"));
return FALSE;
}
else
{
return TRUE;
}
}
}