Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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# 在搜索全局地址列表时,是否有一种方法可以进行部分搜索,而不仅仅是“搜索”呢;用“开始”;_C#_Outlook_Vsto_Exchange Server_Exchangewebservices - Fatal编程技术网

C# 在搜索全局地址列表时,是否有一种方法可以进行部分搜索,而不仅仅是“搜索”呢;用“开始”;

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

我使用以下代码按特定字符串搜索全局通讯簿:

“形态”

问题是它似乎在进行“以开始”搜索,所以我有一个名字叫:

“CONF-123”会出现,但如果我有一个名字“JOE-CONF”,它就不会出现

如何在此行上执行部分字符串搜索

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条目更健壮

  • 必须处理所有
    IDisposable
    s(通常在
    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();
    }
    }
    }
    }
    

虽然通配符搜索在EWS中是不可能的,但在广告搜索中是可能的。广告查询支持通配符。i、 例如,*CONF*可以在AD中搜索,它将返回所有包含“CONF”的结果。根据结果,向EWS查询相应的Exchange对象。您需要找到一个参数,通过该参数可以找到相应的EWS条目。我想电子邮件地址(用户名)应该足以找到相应的exchange对象

广告搜索代码段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;
}