c++ - 我拥有此 AD 域的管理员帐户,如何模拟另一个域用户?

标签 c++ active-directory dns impersonation shared-directory

我正在开发一个 Windows 软件,当您输入域管理员帐户时,它可以显示域中的所有用户、组和共享文件夹信息。我在获取一些共享文件夹信息时遇到了一些问题,因为这些文件夹甚至没有向域管理员授予共享权限(删除共享选项卡中的所有人)。 GetFileSecurity 或 GetNamedSecurityInfo 返回错误代码 5)。但是作为域管理员,我想我可以访问域计算机中共享文件夹的权限信息(只是 ACL,不需要完全访问权限)。

我了解了模拟登录为另一个用户的方法,如果我以在共享文件夹的共享选项卡中被授予读取权限的域用户身份登录,我可以成功获取 ACL。但是这里的问题是我不知道实际环境中域用户的密码,即使我知道他们的用户名并且可以更改他们的密码。

那么当我已经拥有域管理员帐户时,如何获取域用户的访问 token 来模拟,或者还有其他方法吗?

我使用 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;
   }

最佳答案

我读了你的另一个问题。我想我明白你想做什么。为了实现您的目标,您需要具有 impersonation level 的访问 token “模拟”或“委托(delegate)”。您可以通过不同的方式获得它。提供密码是最直接的方法。另一种方法是设置一台机器来做 Protocol Transition .

我个人的建议是避免模仿。只需确保所有共享文件夹都已授予域管理员读取权限。正如我在另一个问题中展示的那样,这根本不是安全妥协。如果域管理员愿意,无论如何都可以随时读取该文件夹。

另外,仅供引用,SysInternals 提供了一些现有工具做类似的事情。

SysInternals 查看 AccessChk.exe 和 AccessEnum.exe

他们都遇到了与您现在面临的相同的权限问题。

关于c++ - 我拥有此 AD 域的管理员帐户,如何模拟另一个域用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10951420/

相关文章:

azure - 服务器宕机时如何设置网站默认页面?

c++ - 从 map 中删除一个元素然后放回去

C++ 基本类型包装器

c++ - FindAtom 和 MAKEINTATOM 没用?

c# - 分页 AD 查询有时会失败

delphi - 如何将Delphi 与Active Directory 集成?

azure - azure 计算模拟器的域名或绑定(bind)名称

copy - 如何使用 robocopy 复制不同域上的目录

c++ - 比较不包括标点符号和空格的字符串

c++ - 如何判断ADsOpenObject绑定(bind)的DC?