我正在开发一个 Windows 软件,当您输入域管理员帐户时,它可以显示域中的所有用户、组和共享文件夹信息。我在获取一些共享文件夹信息时遇到了一些麻烦,因为这些文件夹甚至没有向域管理员授予共享权限(删除共享选项卡中的每个人)。GetFileSecurity 或 GetNamedSecurityInfo 返回错误代码 5)。但是作为域管理员,我认为我可以访问我的域计算机中共享文件夹的权限信息(只是 ACL,不需要完全访问权限)。
我了解了以其他用户身份登录的模拟方法,如果我以在共享文件夹的共享选项卡中被授予读取权限的域用户身份登录,我可以成功获取 ACL。但这里的问题是,我不知道实际环境中域用户的密码,即使我知道他们的用户名并且可以更改他们的密码。
那么,当我已经拥有域管理员帐户时,如何获取域用户的访问令牌来模拟,或者还有其他方法吗?
我使用 C++ 和 ADSI 开发它。下面是登录和获取 NTFS 安全说明方法:
BOOL ADDirectorySearch::logOnByUserPassword(CString strDomainName, CString strUserName, CString strPassword) {
CString strFullUserName = strDomainName + _T("\\") + strUserName;
HANDLE hToken;
BOOL bResult;
bResult = LogonUser(strFullUserName, 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;
}
}
}
PSECURITY_DESCRIPTOR ADDirectorySearch::getNTFSSecDescriptor2(CString strFileName, CString strServerName, CString strServerIP) {
//CString strServerNameWithSlash = _T("\\\\") + strServerName;//"\\\\veotax3";
CString strFilePathName = _T("\\\\") + strServerName + _T("\\") + strFileName;//"\\\\veotax3\\nrdc1001";
CString strFilePathName2 = _T("\\\\") + strServerIP + _T("\\") + strFileName;//"\\\\192.168.1.7\\nrdc1001";
_bstr_t bstrFilePathName = strFilePathName;
BOOL bSuccess = FALSE;
PSECURITY_DESCRIPTOR pSecDescriptorBuf = NULL;
DWORD dwSizeNeeded = 0;label2:;
bSuccess = GetNamedSecurityInfoW(bstrFilePathName, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, NULL, NULL, &pSecDescriptorBuf);
//bSuccess = GetFileSecurityW(bstrFilePathName, DACL_SECURITY_INFORMATION, NULL, 0, &dwSizeNeeded);
if (ERROR_SUCCESS != bSuccess)
{
if (strFilePathName != strFilePathName2)
{
strFilePathName = strFilePathName2;
bstrFilePathName = strFilePathName2;
goto label2;
}
else
{
MyMessageBox_Error(_T("getNTFSSecDescriptor2 Error."), _T("Error"));
return NULL;
}
}
else
{
return pSecDescriptorBuf;
}
}