Почему GetWindowThreadProcessId возвращает 0 при вызове из w3wp.exe - PullRequest
0 голосов
/ 17 февраля 2011

При выполнении следующего кода GetWindowThreadProcessId возвращает 0. Я читал о та же проблема, возникающая со службой , но этот код запускается как пул приложений в IIS (а именно, w3wp .EXE). Кроме того, и w3wp.exe, и файл EXCEL.EXE, который он пытается уничтожить, работают в одном сеансе (сеанс 0) и под одним и тем же пользователем.

if (appClassXls != null)
{
    IntPtr processId = default(IntPtr);
    GetWindowThreadProcessId(appClassXls.Hwnd, out processId);
    Process processXls = Process.GetProcessById(processId.ToInt32());
    if (processXls != null)
    {
        processXls.Kill();
    }
}

Очевидно, что этот код завершается ошибкой, так как он попытается уничтожить pid 0, который является процессом простоя системы вместо экземпляра приложения Excel, который он пытается уничтожить. Почему GetWindowThreadProcessId возвращает 0 при вызове из w3wp.exe в том же сеансе, что и тот же пользователь? И как мне заставить его вернуть правильный pid?

Windows Server 2008 R2 Standard (64-разрядная версия) IIS 7.5 .NET Framework v4.0 Microsoft Office Professional Plus 2010 (чистая установка, настройка для запуска от имени определенного пользователя в настройке DCOM, запускается w3wp.exe)

ОБНОВЛЕНИЕ (2011-02-17 08:33 UTC): Я только что понял, что w3wp.exe запускается с помощью «svchost.exe -k iissvcs», который соответствует «Службе публикации в Интернете», а «Служба активации процессов Windows» и EXCEL.EXE запускаются с помощью «svchost.exe -k». DcomLaunch », что соответствует« Средству запуска процесса DCOM Server », все 3 из которых являются сервисами. Оба файла svchost.exe работают как SYSTEM в сеансе 0, поэтому я до сих пор не понимаю, почему у них или их детей возникли проблемы с доступом друг к другу.

1 Ответ

1 голос
/ 17 февраля 2011

См. Эту запись в блоге , в которой объясняется, как работает изоляция сеанса 0. Похоже, что сервисы и приложения не могут общаться друг с другом. Я пытаюсь выяснить, как назначается «сессия 0». Я полагаю, что оконная станция, которой назначен w3wp, отличается от той, что была запущена для Excel (я полагаю).

Я рекомендую избегать запуска Excel из веб-приложения. Вы можете легко повесить сервер, делая это. Я помню несколько проблем из-за утечек подсчета ссылок в Excel, вызывающих проблемы с памятью, которые в конечном итоге привели бы к гибели сервера. :)

...