我有以下代码可以通过某个字符串搜索全局地址簿:
“ session ”
var esb = new ExchangeServiceBinding();
esb.Url = @"https://myurl.com/EWS/Exchange.asmx";
esb.Credentials = new NetworkCredential(_user,_pwd, _domain);
var rnType = new ResolveNamesType {ReturnFullContactData = true, UnresolvedEntry = "CONF"};
ResolveNamesResponseType response = esb.ResolveNames(rnType);
ArrayOfResponseMessagesType responses = resolveNamesResponse.ResponseMessages;
var responseMessage = responses.Items[0] as ResolveNamesResponseMessageType;
ResolutionType[] resolutions = responseMessage.ResolutionSet.Resolution;
问题是它似乎在进行“开头为”搜索,所以我有一个名为:
“CONF-123”它会出现,但如果我有一个名字“JOE-CONF”,它就不会出现。
如何在这一行进行部分字符串搜索
var rnType = new ResolveNamesType {ReturnFullContactData = true, UnresolvedEntry = "CONF-"};
我希望有这样的东西:
var rnType = new ResolveNamesType {ReturnFullContactData = true, UnresolvedEntry = "%CONF-%"};
但这似乎不起作用。
最佳答案
编辑:2016 年 1 月 4 日 - 添加了用于搜索 AD 的示例代码。
什么行不通
通过 ResolveNames 搜索 GAL 始终使用前缀字符串匹配进行歧义名称解析 (ARN)。尽管 EWS 文档没有明确说明这一点,但 Exchange ActiveSync 文档有说明。 EWS 和 Exchange ActiveSync 只是协议(protocol);它们都依赖底层的 ARN,因此无论您使用 ActiveSync 协议(protocol)还是 EWS,您都只能使用前缀匹配。
这是来自 Exchange ActiveSync 文档的相关引用 (https://msdn.microsoft.com/en-us/library/ee159743%28v=exchg.80%29.aspx)
The text query string that is provided to the Search command is used in a prefix-string match
.
什么会起作用
最好的做法取决于您的用例,但这里有一些想法:
在您的客户端程序(包含您在问题中显示的代码的程序)中搜索 Active Directory
设置您自己的服务来搜索 GAL。您的客户端程序将同时连接到 Exchange 和您的服务。或者您的服务可以代理 EWS,以便客户端程序只需要连接到您的服务。
您将如何获取 GAL 数据?一种方法是重复使用 EWS ResolveNames,以获取 GAL 数据,一次获取 100 个条目,并将此数据缓存在您的服务中。首先检索所有的“a”,然后检索所有的“b”,等等。当然,GAL中的“a”可能超过100个,所以仅仅检索所有的“a”可能需要多次查找- 您将根据每次搜索返回的最后一个条目构建下一个搜索字符串。这可能是缓慢而痛苦的。您可能希望将此数据缓存在数据库中并定期刷新。
您还可以通过 MAPI 访问 GAL。您可以直接使用 MAPI ( https://msdn.microsoft.com/en-us/library/cc765775%28v=office.12%29.aspx ) 或通过类似 Redemption ( http://www.dimastr.com/redemption/home.htm ) 的帮助程序库。无论是直接使用 MAPI 还是通过 Redemption 使用 MAPI,都需要在运行代码的计算机上安装 Outlook(或 Exchange)。由于此限制,最好不要在您的客户端程序中使用 MAPI,而是将其固定在某个服务器上运行的服务中,并让您的客户端程序连接到该服务。
广告代码示例
另一个答案提供了搜索 Active Directory 的示例代码。我正在添加一个代码示例,它可能更适合可能通过搜索找到此问题的人的通用使用。与其他示例相比,下面的代码有以下改进:
如果搜索字符串中包含任何特殊字符(如括号),它们将被转义,以便构造的过滤字符串有效。
仅通过 samaccountname 搜索很多是不够的。如果“David Smith”的帐户名为“dsmith”,则通过 samaccountname 搜索“David”将找不到他。我的示例展示了如何按更多字段进行搜索,并提供了一些您可能想要搜索的字段。
从“GC:”这样的根开始比尝试从 Domain.GetComputerDomain() 构建 LDAP 条目更可靠。
所有 IDisposable 都必须被释放(通常通过在 using 构造中使用它们)。
// Search Active Directory users.
public static IEnumerable<DirectoryEntry> SearchADUsers(string search) {
// Escape special characters in the search string.
string escapedSearch = search.Replace("*", "\\2a").Replace("(", "\\28")
.Replace(")", "\\29").Replace("/", "\\2f").Replace("\\", "\\5c");
// Find entries where search string appears in ANY of the following fields
// (you can add or remove fields to suit your needs).
// The '|' characters near the start of the expression means "any".
string searchPropertiesExpression = string.Format(
"(|(sn=*{0}*)(givenName=*{0}*)(cn=*{0}*)(dn=*{0}*)(samaccountname=*{0}*))",
escapedSearch);
// Only want users
string filter = "(&(objectCategory=Person)(" + searchPropertiesExpression + "))";
using (DirectoryEntry gc = new DirectoryEntry("GC:")) {
foreach (DirectoryEntry root in gc.Children) {
try {
using (DirectorySearcher s = new DirectorySearcher(root, filter)) {
s.ReferralChasing = ReferralChasingOption.All;
SearchResultCollection results = s.FindAll();
foreach (SearchResult result in results) {
using (DirectoryEntry de = result.GetDirectoryEntry()) {
yield return de;
}
}
}
} finally {
root.Dispose();
}
}
}
}
关于c# - 搜索全局地址列表时,有没有办法进行部分搜索而不仅仅是 "startsWith",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33175447/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll