Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>The way I solved this problem is by:</p> <ol> <li>Having an account that has the right to impersonate all users.</li> <li>I create a service for that account with giving a username and password.</li> <li>I impersonate a user and add the subscription of the user to the connection</li> <li>I create another service which is a close for the main service with the same username and password, which will impersonate another user and then add the subscription to the same connection before</li> </ol> <p>Here are two parts of my code . Forget about the LogDevice it is just something internally. The first part is the detailed impersonation and adding the service to the list of services the list of services in my case is a dictionary with the userSMTP is the key , the UserSMTP key here is the impersonated account. </p> <pre><code> /// &lt;summary&gt; /// Impersonate one user at a time and without using the autodiscovery method to find the proper url for the userSmtp, /// and copy the provided url to the usersmtp. /// &lt;/summary&gt; /// &lt;param name="url"&gt; &lt;/param&gt; /// &lt;param name="userSmtp"&gt;user smtp&lt;/param&gt; /// &lt;param name="enableTrace"&gt;to enable logging from the XML tracing &lt;/param&gt; /// &lt;param name="exchangeVersion"&gt;Exchange server version used&lt;/param&gt; private Uri ImpersonateUser(Uri url, string userSmtp, bool enableTrace, ExchangeVersion exchangeVersion) { Uri result = url; var log = "ImpersonateUser \n"; try { log += "0/8 Checking services redundancy\n"; if (Services.ContainsKey(userSmtp)) { Services.Remove(userSmtp); } log += "1/8 Create a new service for " + userSmtp + "\n"; var service = new ExchangeService(exchangeVersion); log += "2/8 Get credentials for the service\n"; var serviceCred = ((System.Net.NetworkCredential)(((WebCredentials)(Services.First().Value.Credentials)).Credentials)); log += "3/8 Assign credentials to the new service\n"; service.Credentials = new WebCredentials(serviceCred.UserName, serviceCred.Password); log += "4/8 TraceEnabled is" + enableTrace.ToString() + "\n"; service.TraceEnabled = enableTrace; log += "5/8 Get the Url for the service with AutodiscoverUrl \n"; service.Url = url; log += "6/8 Assign a new ImpersonatedUserId to the new service for" + userSmtp + "\n"; service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, userSmtp); try { log += "7/8 Validating the impersonation\n"; RuleCollection rulecoll = service.GetInboxRules(); } catch (Exception ex) { _logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUser: failed to validate the impersonation for {0}\n Exception: {1}\n", userSmtp, ex.Message); int hr = System.Runtime.InteropServices.Marshal.GetHRForException(ex); if (hr == -2146233088) // We do not have right to impersonate this user. { result = null; return result; } else { _logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUser(2): trying to resolve {0} with Autodiscover instead...", userSmtp); result = ImpersonateUser(userSmtp, enableTrace, exchangeVersion); } } log += "8/8 Adding the service \n"; if (!Services.ContainsKey(userSmtp)) { Services.Add(userSmtp, service); _logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUser(2): {0} has been impersonated\n", service.ImpersonatedUserId.Id); } } catch (Exception ex) { _logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUser(2): exception {0}\n The exception occured after the following steps: \n{1}", ex.Message, log); } return result; } </code></pre> <p>And here is the code that calls the previous function (i.e. for all users) put in mind that you should somehow storing the email address for every account you want to impersonate. </p> <pre><code>/// &lt;summary&gt; /// To Impersonate users in order to get the info from them. /// &lt;/summary&gt; /// &lt;param name="userSmtps"&gt;List of users to be impersonated&lt;/param&gt; /// &lt;param name="enableTrace"&gt; To enable logging from the XML tracing&lt;/param&gt; /// &lt;param name="exchangeVersion"&gt;Exchange server version used &lt;/param&gt; public void ImpersonateUsers(ICollection&lt;string&gt; userSmtps) { var log = "ImpersonateUsers\n"; var firstUserSmtp = ""; if (userSmtps != null) if (userSmtps.Count &gt; 0) { //the url for the first smtp try { log += "1/2 Impersonating the first userSmtp\n"; _logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUsers: Getting the Url from the autodiscovery for the first smtp {0} ", userSmtps.First()); bool enableTrace = Services.First().Value.TraceEnabled; ExchangeVersion exchangeVersion = Services.First().Value.RequestedServerVersion; firstUserSmtp = userSmtps.First(); var commonSmtpUrl = ImpersonateUser(userSmtps.First(), enableTrace, exchangeVersion); if (commonSmtpUrl == null) userSmtps.Remove(firstUserSmtp); // If the list contains other than the first one log += "2/2 Impersonating " + (userSmtps.Count - 1) + " userSmtps\n"; if (userSmtps.Count &gt;= 1) { foreach (var userSmtp in userSmtps) { try { //skip ther first one because it is already impersonated. if (userSmtp == firstUserSmtp) { continue; } // Impersonate the users _logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUsers: Impersonating {0} ...", userSmtp); commonSmtpUrl = ImpersonateUser(userSmtp, enableTrace, exchangeVersion); } catch (Exception ex) { _logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUsers: Impersonating {1}\n exception {0}\n", ex.Message, userSmtp); } } } } catch (Exception ex) { _logDevice.LogSrvMessage(1, "ExchangeLiteService: ImpersonateUsers: exception {0}\n The exception occured after the following steps: \n{1}", ex.Message, log); } } } </code></pre> <p>I would have put the subscription part and adding to the connection , but it is a bit ugly and hard to get. but the idea is simply that you should have a connection, and then you go to each service you made and then `connection.AddSubscription(streamingSubscription); Where streamingSubscription is extracted from the service. </p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload