Столкнулся на днях с интересной проблемой: несмотря на то, что в конфиге приложения выставлены необходимые настройки, запрос WhoAmIRequest всегда возвращал данные системного пользователя CRM - SYSTEM.
...
<system.web>
...
<authentication mode="Windows"/>
<identity impersonate="true"/>
...
</system.web>
...
Как оказалось, причина была в следующем - WhoAmIRequest выполнялся в методе DoTheJobInThread() в отдельном потоке:
static void Main()
{
...
ParameterizedThreadStart threadStart = new ParameterizedThreadStart(DoTheJobInThread);
thread.Start(threadParam);
...
}
private void DoTheJobInThread(param)
{
...
// вернёт пользователя SYSTEM
WhoAmIResponse user = (WhoAmIResponse)crmService.Execute(new WhoAmIRequest());
...
}
Проблема решилась выносом метода с получением идентификатора пользователя в основной поток приложения:
static void Main()
{
...
ParameterizedThreadStart threadStart = new ParameterizedThreadStart(DoTheJobInThread);
// вернёт имперсонированного пользователя
WhoAmIResponse user = (WhoAmIResponse)crmService.Execute(new WhoAmIRequest());
// передаём пользователя в поток с параметрами метода
threadParam.UserId = user.UserId;
thread.Start(threadParam);
...
}
Кстати, пока искал решение, нашёл вот такой интересный способ получения идентификатора текущего пользователя:
SELECT systemuserid FROM FilteredSystemUser WHERE domainname = SUSER_SNAME()
Добавить комментарий