Win32Exception: доступ запрещен в System.Diagnostics.ProcessManager.OpenProcess ()

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

Сценарий: нет проблем при запуске кода в визуальной студии. Но когда установочный файл запускается на разных машинах и просматривается журнал, он выдает Win32Exception: доступ запрещен.

(Программа запускается автоматически сразу после установки. На самом деле, перед установкой этого приложения уже была установлена ​​служба сторожевого таймера, которая автоматически запускает приложение и восстанавливает его при закрытии. Итак, я считаю, что не могу установить requestExecutionLevel в requireAdmin, который может отображать диалоговое окно подтверждения и предоставлять пользователю контроль над запуском приложения.)

От меня требуется решить эту проблему. После прочтения некоторых блогов я считаю, что это должно быть связано с отсутствием достаточного количества прав для получения необходимой информации. Но я до сих пор не понимаю, как решить эту проблему.

Исключение из файла журнала:

[  1,11216] 2017-04-17T11:43:53 - -------------------- Win32Exception caught --------------------
[  1,11216] 2017-04-17T11:43:53 - Access is denied
[  1,11216] 2017-04-17T11:43:53 - (Win32Err=0x00000005)
[  1,11216] 2017-04-17T11:43:53 - Stack trace is : 
[  1,11216] 2017-04-17T11:43:53 -    at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
   at System.Diagnostics.NtProcessManager.GetModuleInfos(Int32 processId, Boolean firstModuleOnly)
   at System.Diagnostics.NtProcessManager.GetFirstModuleInfo(Int32 processId)
   at System.Diagnostics.Process.get_MainModule()
   at IMPMDesktopClient.BaseIMClientDriver.GetVersion(UIntPtr windowUIntPtr)
   at IMPMDesktopClient.WindowDetector.Hooks.WindowsEventArgs..ctor(Int32 eventNum, UIntPtr windowHandle, Int32 idObject, Int32 idChild, String clsName, Rectangle pos)
   at IMPMDesktopClient.WindowDetector.Hooks.EventHooks.CheckForWindowOfInterest(UIntPtr hWnd, UIntPtr arg)
   at IMPMDesktopClient.WindowDetector.Hooks.EventHooks.CheckTopWindow(UIntPtr hWnd, UIntPtr arg)
   at IMPMDesktopClient.Win32Interop.EnumWindows(WndEnumCallback callback, UIntPtr param)
   at IMPMDesktopClient.WindowDetector.Hooks.EventHooks.DetectTheseWindowsNow(List`1 classes)
   at IMPMDesktopClient.WindowDetector.WindowClassManager.OnPostRegistration()
[  1,11216] 2017-04-17T11:43:53 - --------------------Win32Exception--------------------

Код для GetVersion ():

public static Version GetVersion(UIntPtr windowUIntPtr)
    {
        var noOfTrials = 2;
        var threadSleepPeriod = 1000;
        Process imProc = null;

        while (noOfTrials > 0)
        {
            try
            {
                imProc = Win32Interop.GetWindowProcess(windowUIntPtr);
                Version version;
                try
                {
                    version = GetModuleVersion(imProc.MainModule); 
                }
                catch (System.ComponentModel.Win32Exception)
                {
                    version = GetModuleVersion(imProc.Id);
                }

                // If getting version fails, retry it.
                if (version == null || (version.Major == 0 && version.Minor == 0))
                {
                    // The thread will sleep for 1s after 1st trial, 3s after 2nd trial.
                    Thread.Sleep(threadSleepPeriod);
                    noOfTrials--;
                    threadSleepPeriod += 2000;
                }
                else
                    return version;

                if (noOfTrials == 0)
                {
                    Log.Write(...);
                }
            }
            catch (Exception ex)
            {
                Log.Write(...);
            }
        }
        return new Version();
    }

person Avishekh Bharati    schedule 19.04.2017    source источник
comment
запускать как админ или нет? когда-нибудь пробовали psexc?   -  person Lei Yang    schedule 19.04.2017
comment
Извините .. на самом деле это .msi (установщик), а не отл.   -  person Avishekh Bharati    schedule 19.04.2017


Ответы (1)


Одно из решений - попробовать запустить приложение от имени администратора.

Вы можете сделать это, закрыв визуальную студию, а затем открыв ее с помощью ярлыка с помощью «Щелкните правой кнопкой мыши -> Запуск от имени администратора», затем откройте свое решение из этого экземпляра VS

Если это сработает, настройте приложение на постоянный запуск от имени администратора, отредактировав манифест приложения и изменив <requesteExecutionLevel> на

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
person NattyMan0007    schedule 19.04.2017
comment
Запускаю приложение в режиме администратора. С этим нет проблем. Но когда установщик создается, распространяется QA, а затем, когда он запускается, он выдает ошибку «Доступ запрещен». Но когда установленное приложение затем перезапускается, это решает проблему. - person Avishekh Bharati; 19.04.2017
comment
Вы должны настроить установщик так, чтобы он требовал прав администратора, используя его манифест или другой метод. Чтобы он запросил у системы доступ администратора перед выполнением. - person NattyMan0007; 19.04.2017
comment
Вы можете установить msi в Visual Studio, чтобы требовать права администратора, используя свойство AdminUser или Privledged в новом условии запуска. - person NattyMan0007; 19.04.2017
comment
Похоже, мне не разрешено это делать. Фактически, перед установкой этого приложения уже должна быть установлена ​​служба сторожевого пса, которая автоматически запускает приложение и восстанавливает его при закрытии. Поэтому я считаю, что если я запрошу ExecutionLevel для requireAdministrator, это может открыть диалоговое окно (чего не должно). - person Avishekh Bharati; 19.04.2017
comment
Если пользователь не имеет прав, тогда UAC откроет запрос учетных данных. Если сначала запускается сторожевой таймер, попробуйте настроить сторожевой таймер на requireAdministrator. - person NattyMan0007; 19.04.2017