C# 在搜索全局地址列表时,是否有一种方法可以进行部分搜索,而不仅仅是“搜索”呢;用“开始”;
我使用以下代码按特定字符串搜索全局通讯簿: “形态” 问题是它似乎在进行“以开始”搜索,所以我有一个名字叫: “CONF-123”会出现,但如果我有一个名字“JOE-CONF”,它就不会出现 如何在此行上执行部分字符串搜索C# 在搜索全局地址列表时,是否有一种方法可以进行部分搜索,而不仅仅是“搜索”呢;用“开始”;,c#,outlook,vsto,exchange-server,exchangewebservices,C#,Outlook,Vsto,Exchange Server,Exchangewebservices,我使用以下代码按特定字符串搜索全局通讯簿: “形态” 问题是它似乎在进行“以开始”搜索,所以我有一个名字叫: “CONF-123”会出现,但如果我有一个名字“JOE-CONF”,它就不会出现 如何在此行上执行部分字符串搜索 var rnType = new ResolveNamesType {ReturnFullContactData = true, UnresolvedEntry = "CONF-"}; 我希望会有这样的事情: var rnType = new ResolveNamesTyp
var rnType = new ResolveNamesType {ReturnFullContactData = true, UnresolvedEntry = "CONF-"};
我希望会有这样的事情:
var rnType = new ResolveNamesType {ReturnFullContactData = true, UnresolvedEntry = "%CONF-%"};
但这似乎不起作用。对索引文本字段的模糊搜索只能使用前缀(或后缀…)完成。这就是为什么Exchange可能像“CONF%”一样实现查询
我查看了文档,没有任何方法可以绕过它-全表扫描(对于%CONF来说必须是这样)似乎没有意义 编辑:2016年1月4日-添加搜索广告的示例代码 什么不起作用 通过ResolveNames搜索GAL时,总是使用前缀字符串匹配进行不明确的名称解析(ARN)。尽管EWS文档没有明确说明这一点,但Exchange ActiveSync文档确实如此。EWS和Exchange ActiveSync只是协议;它们都依赖于底层的ARN,所以无论您使用的是ActiveSync协议还是EWS,都必须使用前缀匹配 以下是Exchange ActiveSync文档()中的相关引用 将使用提供给搜索命令的文本查询字符串 在前缀字符串匹配中 什么有效 最好的做法取决于您的用例,但这里有一些想法: 在客户端程序(包含问题中显示的代码的程序)中搜索Active Directory 设置您自己的服务以搜索GAL。您的客户端程序将连接到Exchange和您的服务。或者您的服务可以代理EWS,这样客户端程序只需要连接到您的服务 您将如何获取GAL数据?一种方法是重复使用EWS ResolveNames,以获取GAL数据,一次获取100个条目,并将这些数据缓存到您的服务中。首先,检索所有的“a”,然后检索所有的“b”,等等。当然,GAL中可能有100多个“a”,因此仅获取所有的“a”可能需要多次搜索-您将根据每次搜索返回的最后一个条目构造下一个搜索字符串。这可能是缓慢和痛苦的。您可能希望将此数据缓存在数据库中并定期刷新它 您还可以通过MAPI访问GAL。您可以直接()使用MAPI,也可以通过Redemption()之类的帮助程序库使用MAPI。无论您是直接使用MAPI还是通过赎回使用MAPI,都需要在运行代码的计算机上安装Outlook(或Exchange)。由于此限制,最好不要在客户端程序中使用MAPI,而是将其保留在某个服务器上运行的服务中,并让客户端程序连接到该服务 广告代码示例 另一个答案提供了搜索Active Directory的示例代码。我正在添加一个代码示例,它可能更适合通过搜索找到此问题的人的一般使用。与其他示例相比,下面的代码有以下改进:
- 如果搜索字符串包含任何特殊字符(如括号),将对其进行转义,从而使构造的筛选器字符串有效
- 仅通过samaccountname进行搜索是不够的。如果“David Smith”的帐户名为“dsmith”,则通过SamaAccountName搜索“David”将找不到他。我的示例显示了如何按更多字段进行搜索,并给出了一些可能需要搜索的字段
- 从“GC:”这样的根开始比尝试从Domain.GetComputerDomain()构造LDAP条目更健壮
- 必须处理所有
s(通常在IDisposable
构造中使用它们)using
//搜索Active Directory用户。 公共静态IEnumerable SearchADUsers(字符串搜索){ //对搜索字符串中的特殊字符进行转义。 字符串转义搜索=搜索。替换(“*”,“\\2a”)。替换(“(”,“\\28”) .Replace(“)”,“\\29”)。Replace(“/”,“\\2f”)。Replace(“\\”,“\\5c”); //查找搜索字符串出现在以下任何字段中的条目 //(您可以根据需要添加或删除字段)。 //表达式开头附近的“|”字符表示“任意”。 string searchPropertiesExpression=string.Format( “(|(sn=*{0}*)(givenName=*{0}*)(cn=*{0}*)(dn=*{0}*)(samaccountname=*{0}*)”, 逃避搜查); //只需要用户 字符串筛选器=“(&(objectCategory=Person)(“+searchPropertiesExpression+”)”; 使用(DirectoryEntry gc=new DirectoryEntry(“gc:)){ foreach(gc.Children中的DirectoryEntry根目录){ 试一试{ 使用(DirectorySearcher s=新的DirectorySearcher(根目录,筛选器)){ s、 ReferralChasing=ReferralChasingOption.All; SearchResultCollection results=s.FindAll(); foreach(搜索结果中的搜索结果){ 使用(DirectoryEntry de=result.GetDirectoryEntry()){ 收益率; } } } }最后{ root.Dispose(); } } } }
var rnType = new ResolveNamesType {ReturnFullContactData = true, UnresolvedEntry = "%CONF-%"};
// 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();
}
}
}
}
private SearchResultCollection SearchByName(string username, string password, string searchKeyword)
{
DirectorySearcher ds = new DirectorySearcher(new DirectoryEntry("LDAP://" + Domain.GetComputerDomain().ToString().ToLower(), username, password));
ds.Filter = "(&((&(objectCategory=Person)(objectClass=User)))(samaccountname=*" + searchKeyword + "*))";
ds.SearchScope = SearchScope.Subtree;
ds.ServerTimeLimit = TimeSpan.FromSeconds(90);
return ds.FindAll();
}
<?php
$staffName = $_GET['q'];
require_once './php-ews/EWSType.php';
require_once './php-ews/ExchangeWebServices.php';
require_once 'php-ews/EWSType/RestrictionType.php';
require_once 'php-ews/EWSType/ContainsExpressionType.php';
require_once 'php-ews/EWSType/PathToUnindexedFieldType.php';
require_once 'php-ews/EWSType/ConstantValueType.php';
require_once 'php-ews/EWSType/ContainmentModeType.php';
require_once 'php-ews/EWSType/ResolveNamesType.php';
require_once 'php-ews/EWSType/ResolveNamesSearchScopeType.php';
require_once 'php-ews/NTLMSoapClient.php';
require_once 'php-ews/NTLMSoapClient/Exchange.php';
$host = '[exchange server]';
$user = '[exchange user]';
$password = '[exchange password]';
$ews = new ExchangeWebServices($host, $user, $password);
$request = new EWSType_ResolveNamesType();
$request->ReturnFullContactData = true;
$request->UnresolvedEntry = $staffName;
$displayName = '';
$i = 0;
$staff_members = false;
$response = $ews->ResolveNames($request);
if ($response->ResponseMessages->ResolveNamesResponseMessage->ResponseClass == 'Error' && $response->ResponseMessages->ResolveNamesResponseMessage->MessageText == 'No results were found.') {
}
else {
$numNamesFound = $response->ResponseMessages->ResolveNamesResponseMessage->ResolutionSet->TotalItemsInView;
$i2=0;
for ($i=0;$i<$numNamesFound;$i++) {
if ($numNamesFound == 1) {
$displayName = $response->ResponseMessages->ResolveNamesResponseMessage->ResolutionSet->Resolution->Contact->DisplayName;
}
else {
$displayName = $response->ResponseMessages->ResolveNamesResponseMessage->ResolutionSet->Resolution[$i]->Contact->DisplayName;
}
echo "DisplayName: " . $displayName . "\n";
if (stripos($displayName, 'External') == true) {
}
else {
$searchLen = strlen($staffName);
if (strcasecmp(substr($displayName, 0, $searchLen), $staffName) == 0) {
if ($numNamesFound == 1) {
$emailAddress = $response->ResponseMessages->ResolveNamesResponseMessage->ResolutionSet->Resolution->Mailbox->EmailAddress;
}
else {
$emailAddress = $response->ResponseMessages->ResolveNamesResponseMessage->ResolutionSet->Resolution[$i]->Mailbox->EmailAddress;
}
$staff_members[$i2] = array( 'name' => $displayName,'email' => $emailAddress );
$i2++;
}
}
}
$staffJson = json_encode($staff_members);
echo $staffJson;
}