2012-06-08 52 views
0

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

}

回答

2

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

我个人的建议是避免冒充他人。只要确保所有共享文件夹都具有授予域读取权限的域管理员。正如我在另一个问题中所表明的那样,这完全不是安全妥协。无论如何,域管理员总是可以有办法读取文件夹。

此外,还有一些现有的工具可以从SysInternals做类似的事情。从SysInternals

退房AccessChk.exe和AccessEnum.exe他们都来自相同的权限问题,因为你所面对的现在受苦。

+0

感谢您留下深刻印象的答案。这个软件是为了客户的需要而不是自用的。我的队友还表示,当有人试图分享某些内容时,通常会删除Everyone读取权限。所以我无法获得域管理员的读访问权限。但你建议不要使用你提供的两种方式:采取所有者和模仿。仅供参考,我还发现了一种WMI查询方法来检查共享权限,但这种方式依赖于远程设备上的一些服务和防火墙设置。那么这里至少有三种方法,那么做这件事最安全有效的方法是什么? – hsluoyz

+0

听起来像你已经找到了解决方案。在提到WMI后,我会进行一些搜索并了解共享文件夹与我描述的不同。我会在另一篇文章中删除我的答案。我认为你正朝着正确的方向前进。我刚刚发现您似乎在执行类似于[共享和存储管理](http://technet.microsoft.com/zh-cn/library/cc731574.aspx)的操作,但您呈现给用户的方式就像一份报告。 –

+0

我不建议使用模拟,因为我认为提供密码不是一个好方法。首先,你不知道你应该扮演谁。其次,您需要以安全的方式存储许多用户的密码。做协议转换避免保存密码。但是,这需要设置一个几乎与域控制器一样强大的专用机器。你不希望你的客户为此安装一台机器。 –

0

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

0

您不能也不应该“冒充”任何您没有密码的帐户 - 并且因此没有权限使用 - 因为您的意思不是即使您是管理员也可以代表他/她做任何事情,并且可以更改他或她的密码 - 除非明确授权。您也不应修改任何您不是所有者的文件夹的权限 - 除非获得授权。做一名“管理员”并不意味着你是一位上帝般的生物,你可以免于公司政策。

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

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

管理员从文件夹中删除访问权限也有很好的理由 - 管理员总是可以访问某些内容并不意味着他或她可以这样做 - 如果没有许可,可能会让您遇到麻烦。删除(某些)管理员的权限意味着您不能“错误地”访问您未明确允许访问的文件。

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

相关问题