Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自特定OU的广告用户列表';s_C#_C# 4.0 - Fatal编程技术网

C# 来自特定OU的广告用户列表';s

C# 来自特定OU的广告用户列表';s,c#,c#-4.0,C#,C# 4.0,我试图在我的公司广告中只打印某些OU的用户。 到目前为止,我已经想到了这个: string groupName = "Domain Users"; string domainName = "domain"; PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domainName); GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType

我试图在我的公司广告中只打印某些OU的用户。
到目前为止,我已经想到了这个:

string groupName = "Domain Users";
string domainName = "domain";

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domainName);
GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, groupName);

if (grp != null)
{
    foreach (Principal p in grp.GetMembers(false))
    {
        Console.WriteLine(p.SamAccountName + " - " + p.DisplayName);
    }


    grp.Dispose();
    ctx.Dispose();
    Console.ReadLine();
}
else
{
    Console.WriteLine("\nWe did not find that group in that domain, perhaps the group resides in a different domain?");
    Console.ReadLine();
}
问题是它打印每个用户,而不是像“员工”或“学生”这样的特定OU


我如何添加一个参数来指定1个或2个OU,它应该循环通过,而不是一个组

我不知道你的代码,所以这是伪代码

当您有一些属性(例如字符串)来指定类型时,请使用
Where

 var groupName = "Student";
 foreach (Principal p in grp.GetMembers(false).Where(princ => princ.OUName.Equals(groupName))
 {
     Console.WriteLine(p.SamAccountName + " - " + p.DisplayName);
 }
或者它是某种类型的继承,然后可以使用类型的:

 foreach (Principal p in grp.GetMembers(false).OfType<Student>())
 {
     Console.WriteLine(p.SamAccountName + " - " + p.DisplayName);
 }
foreach(grp.GetMembers(false).OfType()中的主体p)
{
Console.WriteLine(p.SamAccountName+“-”+p.DisplayName);
}

我不确切知道您的代码,所以这是伪代码

当您有一些属性(例如字符串)来指定类型时,请使用
Where

 var groupName = "Student";
 foreach (Principal p in grp.GetMembers(false).Where(princ => princ.OUName.Equals(groupName))
 {
     Console.WriteLine(p.SamAccountName + " - " + p.DisplayName);
 }
或者它是某种类型的继承,然后可以使用类型的:

 foreach (Principal p in grp.GetMembers(false).OfType<Student>())
 {
     Console.WriteLine(p.SamAccountName + " - " + p.DisplayName);
 }
foreach(grp.GetMembers(false).OfType()中的主体p)
{
Console.WriteLine(p.SamAccountName+“-”+p.DisplayName);
}

您正在搜索整个域,“域用户”可能不是您想要的OU,请更改变量名称并添加:

string domainName = "Domain Users";
string groupName = "Students";
然后将OU添加到PrincipalContext:

var ctx = new PrincipalContext(ContextType.Domain, domainName, groupName);

您正在搜索整个域,“域用户”可能不是您想要的OU,请更改变量名称并添加:

string domainName = "Domain Users";
string groupName = "Students";
然后将OU添加到PrincipalContext:

var ctx = new PrincipalContext(ContextType.Domain, domainName, groupName);

我在应用程序中使用以下代码

这对你来说可能有点过分了,但我认为它基本上符合你的需要

public static void DoStuff(UserPrincipal princ) {

        var allDomains = Forest.GetCurrentForest().Domains.Cast<Domain>();

        var allSearcher = allDomains.Select(domain => {
          var searcher = new DirectorySearcher(new DirectoryEntry("LDAP://" + domain.Name));
          searcher.Filter = $"(&(&(objectCategory=person)(objectClass=user)(userPrincipalName=*{princ.SamAccountName}*)))";
          return searcher;
        });

        var directoryEntriesFound =
          allSearcher.SelectMany(searcher =>
            searcher.FindAll()
              .Cast<SearchResult>()
              .Select(result => result.GetDirectoryEntry()));

        var memberOf = directoryEntriesFound.Select(entry => {
          using (entry) {
            return new {
              Name = entry.Name,
              GroupName = ((object[])entry.Properties["MemberOf"].Value)
                .Select(obj => obj.ToString())
            };
          }
        }
          );

        var result1 = new List<string>();
        foreach (var member in memberOf) {
          if(member.GroupName.Contains("Student") )
            Console.WriteLine(princ.SamAccountName + " is Student");
          if (member.GroupName.Contains("Employee"))
            Console.WriteLine(princ.SamAccountName + " is Employee");

        }


      }
publicstaticvoiddostuff(UserPrincipal-princ){
var allDomains=Forest.GetCurrentForest().Domains.Cast();
var allSearcher=allDomains.Select(domain=>{
var searcher=newdirectorysearcher(newdirectoryentry(“LDAP:/”+domain.Name));
searcher.Filter=$”(&(&(objectCategory=person)(objectClass=user)(userPrincipalName=*{princ.SamAccountName}*))”;
返回搜索器;
});
已找到var DirectoryEntries=
allSearcher.SelectMany(searcher=>
searcher.FindAll()
.Cast()
.Select(result=>result.GetDirectoryEntry());
var memberOf=directoryEntriesFound.Select(条目=>{
使用(条目){
还新{
Name=entry.Name,
GroupName=((对象[])项。属性[“MemberOf”]。值)
.Select(obj=>obj.ToString())
};
}
}
);
var result1=新列表();
foreach(memberOf中的var成员){
if(member.GroupName.Contains(“学生”))
Console.WriteLine(princ.SamAccountName+“是学生”);
if(member.GroupName.Contains(“Employee”))
Console.WriteLine(princ.SamAccountName+“是雇员”);
}
}

只需在您的
foreach中调用它(grp.GetMembers中的主体p(false))
我在应用程序中使用以下代码

这对你来说可能有点过分了,但我认为它基本上符合你的需要

public static void DoStuff(UserPrincipal princ) {

        var allDomains = Forest.GetCurrentForest().Domains.Cast<Domain>();

        var allSearcher = allDomains.Select(domain => {
          var searcher = new DirectorySearcher(new DirectoryEntry("LDAP://" + domain.Name));
          searcher.Filter = $"(&(&(objectCategory=person)(objectClass=user)(userPrincipalName=*{princ.SamAccountName}*)))";
          return searcher;
        });

        var directoryEntriesFound =
          allSearcher.SelectMany(searcher =>
            searcher.FindAll()
              .Cast<SearchResult>()
              .Select(result => result.GetDirectoryEntry()));

        var memberOf = directoryEntriesFound.Select(entry => {
          using (entry) {
            return new {
              Name = entry.Name,
              GroupName = ((object[])entry.Properties["MemberOf"].Value)
                .Select(obj => obj.ToString())
            };
          }
        }
          );

        var result1 = new List<string>();
        foreach (var member in memberOf) {
          if(member.GroupName.Contains("Student") )
            Console.WriteLine(princ.SamAccountName + " is Student");
          if (member.GroupName.Contains("Employee"))
            Console.WriteLine(princ.SamAccountName + " is Employee");

        }


      }
publicstaticvoiddostuff(UserPrincipal-princ){
var allDomains=Forest.GetCurrentForest().Domains.Cast();
var allSearcher=allDomains.Select(domain=>{
var searcher=newdirectorysearcher(newdirectoryentry(“LDAP:/”+domain.Name));
searcher.Filter=$”(&(&(objectCategory=person)(objectClass=user)(userPrincipalName=*{princ.SamAccountName}*))”;
返回搜索器;
});
已找到var DirectoryEntries=
allSearcher.SelectMany(searcher=>
searcher.FindAll()
.Cast()
.Select(result=>result.GetDirectoryEntry());
var memberOf=directoryEntriesFound.Select(条目=>{
使用(条目){
还新{
Name=entry.Name,
GroupName=((对象[])项。属性[“MemberOf”]。值)
.Select(obj=>obj.ToString())
};
}
}
);
var result1=新列表();
foreach(memberOf中的var成员){
if(member.GroupName.Contains(“学生”))
Console.WriteLine(princ.SamAccountName+“是学生”);
if(member.GroupName.Contains(“Employee”))
Console.WriteLine(princ.SamAccountName+“是雇员”);
}
}

只需在您的
foreach(grp.GetMembers中的主体p(false))中调用它

如果您想将搜索限制到单个OU/容器,您可以使用另一个
PrincipalContext
构造函数绑定到该OU/容器:

string groupName = "Domain Users";
string domainName = "domain";
string ouName = "CN=Users,DC=yourcompany,DC=com";

// bind to the specified container you want
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domainName, ouName);

然后,当然,您只能在
CN=Users
容器中搜索,没有其他地方。

如果您想将搜索限制为单个OU/容器,您可以使用另一个
PrincipalContext
构造函数绑定到该OU/容器:

string groupName = "Domain Users";
string domainName = "domain";
string ouName = "CN=Users,DC=yourcompany,DC=com";

// bind to the specified container you want
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domainName, ouName);

然后,当然,您只在
CN=Users
容器中搜索,没有其他地方。

您希望您是一个组吗?如果是,为什么你要在
域用户
中搜索,而不是在你想要的组中搜索?试图得到我现在得到的不同结果,因为我正在分组搜索,但我想将“域用户”分为不同的“容器”,他们目前所在的OU是“雇员和学生”。。如果这样做有意义:)如何指定类型
员工
学生
它是
主体
中的属性?员工和学生是“员工安全”、“员工安全”组的成员,但我想将其导出到数据库。可能有些学生你不想输出,而只选择某些OU。所以我真正想要的是一种搜索OU名称而不是组的方法:)你想要的OU是一个组吗?如果是,为什么要在
域用户
中搜索,而不是在所需的组中搜索?试图找到不同的组