0

我正在开发一个 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;
   }

}

4

3 回答 3

2

我读了你的另一个问题。我想我明白你想做什么。为了实现您的目标,您需要具有模拟级别“模拟”或“委托”的访问令牌。你可以通过不同的方式得到它。提供密码是最直接的方法。另一种方法是设置一台机器来进行协议转换

我个人的建议是避免冒充。只需确保所有共享文件夹都已授予域管理员读取权限。正如我在另一个问题中所展示的,这根本不是安全妥协。如果愿意,域管理员始终可以通过某种方式读取文件夹。

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

从 SysInternals 查看 AccessChk.exe 和AccessEnum.exe

他们都遭受与您现在面临的相同的权限问题。

于 2012-06-23T23:54:29.560 回答
0

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

于 2014-01-30T22:27:37.127 回答
0

您不能也不应该“冒充”任何您没有密码的帐户 - 因此无权使用 - 因为即使您是管理员并且可以更改他或她的密码 - 除非明确授权。除非获得授权,否则您也不应该修改您不是其所有者的任何文件夹的权限。成为“管理员”并不意味着您是神一样的生物,并且您不受公司政策的约束。

这一切都与“问责制”有关——账户不仅要允许或拒绝访问,还要记录和审计谁做了什么,从而对谁负责。有一些法律要求可以要求识别和控制有权访问某种敏感信息的人 - 并限制可以访问这些信息的人数。Windows 具有审计用户操作的工具——包括文件访问。

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

也有充分的理由从文件夹中删除管理员的访问权限 - 管理员总是可以访问某些内容的事实并不意味着他或她可以这样做 - 未经许可这样做可能会给您带来麻烦。从(某些)管理员那里删除权限意味着您不能“错误地”访问未明确允许访问的文件。

在正确设置的系统中,日志也被发送到大多数管理员但具有高权限的管理员无权访问的不同机器 - 以确保执行和审核公司有关数据保护的政策,而管理员无法清除日志以隐藏其踪迹。

于 2014-11-07T12:35:22.800 回答