我们IT小组的生产变更实施者被分配任务,审查我们小组所有各种对象的安全性,主要是为了确保已经离开我们雇用或转到其他小组的人员不再访问我们的服务器共享、Web目录、SQL数据库等等。最近我们完成了SQL部分,并且有一个可重复使用的脚本,可以每年运行一次(或任何我们想要的频率)。它效果很好,我们在几分钟内审核了10个左右服务器上的20个数据库。
现在是服务器的事情。我编写了一个使用.NET 2.0的C#应用程序,它会递归扫描一个目录列表并将ACL(访问控制列表)转储到文本文件中。这非常有效,但只能在本地计算机上运行。UNC和映射路径不起作用,我得到以下异常消息:“进程没有拥有所需此操作的“SeSecurityPrivilege”特权。” 在这一行:
现在是服务器的事情。我编写了一个使用.NET 2.0的C#应用程序,它会递归扫描一个目录列表并将ACL(访问控制列表)转储到文本文件中。这非常有效,但只能在本地计算机上运行。UNC和映射路径不起作用,我得到以下异常消息:“进程没有拥有所需此操作的“SeSecurityPrivilege”特权。” 在这一行:
DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All);
其中 di 是从 DirectoryInfo[] 数组枚举出的 DirectoryInfo 对象。
我们可能无法获得 SeSecurityPrivilege 权限,但我认为这并不是必要的。我可以打开文件夹,右键单击属性,然后点击安全选项卡,在 GUI 中查看它。我应该也能以编程方式访问它。
您有什么想法,如何更改此代码部分以获取目标文件夹的权限?
private void CheckSecurity(DirectoryInfo[] DIArray)
{
foreach (DirectoryInfo di in DIArray)
{
DirectorySecurity DirSec = di.GetAccessControl(AccessControlSections.All);
string sAccessInfo = string.Empty;
foreach (FileSystemAccessRule FSAR in DirSec.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
{
sAccessInfo += GetAceInformation(FSAR);
}
if (sAccessInfo != string.Empty)
{
// Write info to text file
}
}
}
private string GetAceInformation(FileSystemAccessRule ace)
{
StringBuilder info = new StringBuilder();
string line = string.Format("Account: {0}", ace.IdentityReference.Value);
info.AppendLine(line);
line = string.Format("Type: {0}", ace.AccessControlType);
info.AppendLine(line);
line = string.Format("Rights: {0}", ace.FileSystemRights);
info.AppendLine(line);
line = string.Format("Inherited ACE: {0}", ace.IsInherited);
info.AppendLine(line);
return info.ToString();
}
编辑: 如果获取根文件夹的“GetAccessControl()”方法失败,我该如何检查远程文件夹中ACL的读取属性?(如果我传入\ server \ path,则在获取\ server \ path的信息时出错)。
用户帐户是域帐户,我有权限读取文件结构。 我可以从文件/文件夹属性中查看安全性。
我将检查进程监视器,但我不确定是否能在服务器上运行它(我不是所涉及服务器的管理员)。