如何冒充其他域用户,因为我拥有此AD域的管理员帐户?

时间:2012-06-08 15:06:46

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

我正在使用Windows软件,当您输入域管理员帐户时,该软件可以显示域中的所有用户,组和共享文件夹信息。我在获取某些共享文件夹信息时遇到一些问题,因为这些文件夹甚至没有向域管理员授予共享权限(删除共享选项卡中的Everyone)。 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;
   }

}

3 个答案:

答案 0 :(得分:2)

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

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

另外,fyi,SysInternals可以使用一些现有的工具来做类似的事情。

SysInternals

查看AccessChk.exe和AccessEnum.exe

他们都遭遇与您现在面临的相同的许可问题。

答案 1 :(得分:0)

在创建包含配置文件或主驱动器的共享时,忘记授予管理员访问权限是常见的错误。权限通常通过 CREATOR OWNER 驱动,并且此类共享中的继承被破坏。管理员进入的唯一方法是取得所有权。取得所有权当然会给最终用户带来问题。在某些情况下,如果明确谁是特定文件夹的所有者(例如,文件夹名称等于用户帐户名称),您可以使用将获得所有权的脚本 - >设置管理员权限 - >设置权限回到从文件夹名称收集的用户帐户名称。 如果您仍然感兴趣,我可以在这里发布代码

答案 2 :(得分:0)

你不能也不应该冒充"任何您没有密码的帐户 - 因此无权使用 - 因为即使您是管理员并且可以更改他或她,您也无意代表他/她执行任何操作密码 - 除非明确授权。除非获得授权,否则您不应修改您不是所有者的任何文件夹的权限。成为"管理员"并不意味着你是一个像神一样的生物,并且你可以免除公司政策。

所有关于"问责制" - 帐户不仅允许或拒绝访问,还记录和审核谁做了什么,从而负责。有法律要求可以要求识别和控制谁有权访问某种敏感信息 - 并限制可以访问它们的人数。 Windows具有审计用户操作的功能 - 包括文件访问。

这就是为什么Windows不允许您代表任何用户行事的原因,除非明白允许 - 即使您是管理员。

管理员可以从文件夹中删除访问权限的理由很充分 - 管理员可以随时访问某些内容并不意味着他或她被允许这样做 - 并且未经许可进行操作可能会让您进入麻烦。删除(某些)管理员的权限意味着你不能错误地#34;访问您未明确允许访问的文件。

在正确设置的系统中,日志也会发送到不同的计算机,大多数管理员但高权限的计算机都无权访问 - 以确保强制执行和审核有关数据保护的公司策略,而无需管理员清除日志以隐藏其跟踪