我有一个sharepoint 2013项目,我需要创建一个在过去30天内在活动目标上创建的所有员工的列表。
最好的方法是什么?
我认为我可以使用system.DirectoryServices对活动目录执行c#查询,但因为我在sharepoint服务器场上实现这一点,所以我不知道是否是最好的方法。
在sharepoint上我运行了User Profile Service,所以我的问题是我是否可以使用User Profile Service执行此操作或使用“old c#way”
由于 弗拉维奥
答案 0 :(得分:1)
如果您运行“用户个人资料服务同步”服务,您的“用户信息列表”将会上传。然后,您可以按创建日期过滤列表。你也可以同步。带有“用户信息列表”的任何AD字段 (简单:http://yasingokhanyuksel.blogspot.com.tr/2015/11/sharepoint-survey-add-active-directory.html)
隐藏“用户信息列表”,因此请键入http://yourSiteUrl/_catalogs/users/simple.aspx
更多信息 http://zimmergren.net/technical/sharepoints-hidden-user-list-user-information-list
答案 1 :(得分:1)
ygy59关于隐藏的"用户信息列表"是SharePoint中用户日期的唯一来源。要以编程方式访问它,您可以执行以下操作:
using (ClientContext context = new ClientContext(projURL))
{
CamlQuery query = new CamlQuery();
query.ViewXml = "";
ListItemCollection items = context.Web.SiteUserInfoList.GetItems(query);
context.Load(items);
context.ExecuteQuery();
foreach (ListItem item in items)
{
DateTime hireDate = (DateTime)item["Created"];
if(hireDate > DateTime.Today.AddDays(-30))
{
Console.WriteLine(item["Name"]);
}
}
Console.ReadLine();
}
请务必注意,这是项目添加到SharePoint的日期,而不是帐户的创建日期。这是您可以通过服务器设置控制的。
答案 2 :(得分:0)
的Flávio,
当我过去为SharePoint环境创建这些类型的解决方案时,我经常不得不在实时编辑它们以考虑一开始未指定的“新要求”。
我建议您构建解决方案,以便用户和/或您自己添加额外的字段进行显示,并按其他时间段选择,例如:过去7天内的新用户,过去90天内的新用户。或显示名字,登录,姓氏,部门,经理,电子邮件,电话等
我们通过允许使用特定的网址参数来为一个项目做到这一点,例如myreport.aspx NUMDAYS = 60&安培;显示=名字,经理,电子邮件
祝你好运多吉
答案 3 :(得分:0)
SharePoint的用户个人资料服务对很多事情很有用,但我不确定这里是否有必要(您不会创建受众群体,从多个来源汇总用户信息) ,暴露可编辑属性等)。
假设这是一个内部部署的SharePoint场以及内部部署的Active Directory,我只是直接点击Active Directory获取此信息。
正如您所提到的,您需要在C#代码中添加对System.DirectoryServices
的引用。
string subpath = "CN=something, CN=com"; // CNs appropriate to your environment here
string filter = ""; // append additional LDAP filter parameters as necessary
// build LDAP filter query
DateTime date = DateTime.UtcNow;
date.AddDays(-30);
string LDAPQuery = "(&(whenCreated>="+date.ToString("YYYYMMdd")+"000000.0Z)" + filter + ")";
// get DNS host name
DirectoryEntry entry = new DirectoryEntry("LDAP://RootDSE");
Object value = entry.NativeObject;
string dnsHostName = entry.Properties["dnsHostName"].value.ToString();
// search Active Directory
DirectorySearcher searcher = new DirectorySearcher();
searcher.Filter = LDAPQuery;
searcher.SearchRoot = new DirectoryEntry("LDAP://"+dnsHostName+"/"+subpath);
SearchResultCollection results = searcher.FindAll();
// then iterate through results and
// either display them on a page or create items in a list
正如Dorje McKinnon所说,使代码足够灵活以适应新要求是个好主意。我将LDAP查询和子路径字符串参数化并将它们放在某个SharePoint列表中,然后让C#代码在执行查询之前从SharePoint列表中检索它们。
如果要经常运行此代码,并且它仅用于报告目的,您可能希望避免为发现的每个AD配置文件创建SharePoint列表项,而只是显示页面上的结果,例如在网格视图中。