我正在使用Windows软件,它可以在您输入域管理员帐户时显示域中的所有用户,组和共享文件夹信息。我在获取某些共享文件夹信息时遇到了一些麻烦,因为这些文件夹甚至没有向域管理员授予共享权限(在共享选项卡中删除Everyone)。 GetFileSecurity或GetNamedSecurityInfo返回错误代码5)。但作为域管理员,我想我可以在我的域计算机中访问共享文件夹的权限信息(只需ACL,不需要完全访问权限)。如何模拟另一个域用户,因为我拥有此AD域的管理员帐户?
我了解了登录成为另一个用户的模拟方法,如果我以共享文件夹的共享选项卡中被授予读取权限的域用户身份登录,则可以成功获取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;
}
}
感谢您留下深刻印象的答案。这个软件是为了客户的需要而不是自用的。我的队友还表示,当有人试图分享某些内容时,通常会删除Everyone读取权限。所以我无法获得域管理员的读访问权限。但你建议不要使用你提供的两种方式:采取所有者和模仿。仅供参考,我还发现了一种WMI查询方法来检查共享权限,但这种方式依赖于远程设备上的一些服务和防火墙设置。那么这里至少有三种方法,那么做这件事最安全有效的方法是什么? – hsluoyz
听起来像你已经找到了解决方案。在提到WMI后,我会进行一些搜索并了解共享文件夹与我描述的不同。我会在另一篇文章中删除我的答案。我认为你正朝着正确的方向前进。我刚刚发现您似乎在执行类似于[共享和存储管理](http://technet.microsoft.com/zh-cn/library/cc731574.aspx)的操作,但您呈现给用户的方式就像一份报告。 –
我不建议使用模拟,因为我认为提供密码不是一个好方法。首先,你不知道你应该扮演谁。其次,您需要以安全的方式存储许多用户的密码。做协议转换避免保存密码。但是,这需要设置一个几乎与域控制器一样强大的专用机器。你不希望你的客户为此安装一台机器。 –