使用 DirectoryServices 添加文件访问权限






4.90/5 (16投票s)
2003年4月27日
1分钟阅读

156911
如何在 .NET 框架中使用 DirectoryServices 在 Active Directory 中为文件添加用户访问权限
引言
正如文章标题所述,本文将介绍一个非常简单但非常有用的主题。 我们时不时会遇到需要修复文件或文件夹权限以添加或删除用户的情况。 一个很好的例子是 ASP.Net 应用程序的安装。 如果应用程序中有一个文件夹需要为 ASPNET 用户帐户提供写入权限,那么您的自定义安装程序可能需要添加一个新的 ACE,以赋予 ASPNET 用户所需的权限。
代码
您可以使用 DirectoryServices
类来完成此任务。 从技术上讲,该技术根本没有使用 System.DirectoryServices
命名空间中定义的类。 它使用 Interop 访问 ADSI
对象来完成工作。 使用 Interop 的原因与我们在之前的文章 如何获取文件安全信息 中描述的原因相同,DirectoryServices
类并未完全实现 ADSI
中存在的所有功能。
using System;
using System.Collections;
using ActiveDs;
namespace PardesiServices.FixFilePermission
{
class FileSecurity
{
[STAThread]
static void Main(string[] args)
{
string strFile = @"D:\mmcInst.log";
try
{
ADsSecurityUtilityClass secuUtil = new ADsSecurityUtilityClass();
object ob = secuUtil.GetSecurityDescriptor(
strFile,
(int)ActiveDs.ADS_PATHTYPE_ENUM.ADS_PATH_FILE,
(int)ActiveDs.ADS_SD_FORMAT_ENUM.ADS_SD_FORMAT_IID);
if (null != ob)
{
ActiveDs.IADsSecurityDescriptor sd =
(IADsSecurityDescriptor)ob;
ActiveDs.IADsAccessControlList obDacl =
(ActiveDs.IADsAccessControlList)sd.DiscretionaryAcl;
bool bAddAce = true;
IEnumerator obAceEnum = obDacl.GetEnumerator();
while (obAceEnum.MoveNext())
{
IADsAccessControlEntry obAce =
(IADsAccessControlEntry)obAceEnum.Current;
Console.WriteLine("Trustee: {0}", obAce.Trustee);
// Check if "ASPNET" account is trustee of ACE or not.
if (obAce.Trustee.IndexOf("ASPNET") != -1)
{
// Check if this is a ALOWED Ace or not.
if (obAce.AceType ==
(int)ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_ALLOWED)
{
bAddAce = false;
}
}
}
// If bAddAce flag is set, then we will add it.
if (bAddAce)
{
AccessControlEntryClass obNewAce =
new AccessControlEntryClass();
obNewAce.AceType =
(int)ADS_ACETYPE_ENUM.ADS_ACETYPE_ACCESS_ALLOWED;
obNewAce.Trustee = @"ASPNET";
obNewAce.AccessMask = -1;
obDacl.AddAce(obNewAce);
sd.DiscretionaryAcl = obDacl;
secuUtil.SetSecurityDescriptor(
strFile,
(int)ADS_PATHTYPE_ENUM.ADS_PATH_FILE,
sd,
(int)ADS_SD_FORMAT_ENUM.ADS_SD_FORMAT_IID);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
请注意,在代码顶部,我们引用了 ActiveDs
命名空间。 此命名空间是通过在您的项目中引用 Active DS Type Library COM 对象来包含到项目中的。 如果您使用 Visual Studio .NET IDE,则可以右键单击项目并选择 添加引用 菜单选项以添加所需的 COM 对象引用。 如果您使用的是命令行编译器,则使用 tlbimp 实用程序导入 activeds.tlb。