Win32Exception: Отказано в доступе
Atom
17.05.2010
Greene


Здравствуйте, Михаил.

Можете подсказать, пожалуйста, с чем может быть связана следующая проблема?

При вызове: var trader = new SmartTrader("<my_login>", "<my_password>"); получаю ошибку: 17.05.2010 0:05:46: ERROR: System.ComponentModel.Win32Exception: Отказано в доступе at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited) at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited) at System.Diagnostics.Process.Kill() at Ecng.Trading.Smart.SmartTrader.☻() at Ecng.Trading.Smart.SmartTrader..ctor(String login, String password, IPEndPoint endPoint, Boolean isAutoSaveOrders) at Ecng.Trading.Smart.SmartTrader..ctor(String login, String password, IPEndPoint endPoint) at Ecng.Trading.Smart.SmartTrader..ctor(String login, String password) at WealthLab.TradingSystemExecutor.Main(String[] args) in D:\home \HFT\MTS\WealthLab\WealthLab\base\TradingSystemExecutor.cs:line 74

Программу запускаю под администратором.


Теги:


Спасибо:


Greene

Фотография
Дата: 17.05.2010
Ответить


попробовал приконнектится к квику: var trader = new QuikTrader("C:\Program Files\Quik5\");

  • эксепшена не возникает.
Спасибо:

Mikhail Sukhov

Фотография
Дата: 17.05.2010
Ответить


SmartTrader при старте убивает процесс SmartCOM2.exe (для предотвращения зависания). У Вас видимо прога не имеет прав к удалению этому процессу. Критично получить админские права на машину?

Спасибо:

Greene

Фотография
Дата: 17.05.2010
Ответить


Спасибо! Я уже понял, что проблема не связана с вашим фреймворком.

Я работаю под администратором в Visual Studio 2008 Pro. Когда я запускаю программу из експлорера или в студии без дебага - процесс убивается нормально. Ошибка возникает только когда я запускаю программу в студии через "F5" (start debugging). Видимо при этом используется какая-то другая аутентификация.

Спасибо:

Mikhail Sukhov

Фотография
Дата: 17.05.2010
Ответить


Какая ОС?

Спасибо:

Greene

Фотография
Дата: 17.05.2010
Ответить


winXP pro sp3

Спасибо:

Mikhail Sukhov

Фотография
Дата: 17.05.2010
Ответить


Если под debug права меняются, то рекомендую переставить VS. Антивирусов случаем никаких не стоит?

Спасибо:

Greene

Фотография
Дата: 17.05.2010
Ответить


антивирус стоит, конечно. ладно, это пока не мегакритично. поразбираюсь попозже. как пофикшу - отпишусь сюда в чем была проблема.

Спасибо:

pyhta4og

Фотография
Дата: 17.02.2011
Ответить


Аналогичная проблема.

При запуске SmartSample в debug-режиме под Visual Studio 2008

получаю Win32Exception "Access Denied" at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited) at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited) at System.Diagnostics.Process.Kill() at Ecng.Trading.Smart.SmartTrader.KillSmartComProcess() at Ecng.Trading.Smart.SmartTrader.OnConnect()

Если пускать .exe файл - ошибки нет.

Специально воспроизвел эту ошибку вызывая из тестового приложения OpenProcess для notepad.exe и для smartcom2.exe Для первого все нормально даже в дебаге, для второго - под дебагом в VS - ошибка.

Порылся по форумам нашел решение (чтобы это ни значило, но работает). Чтобы убивать любые процессы надо своему процессу поставить SeDebugPriviledge

Для этого нашел классик - см код ниже. Для использования в SmartSample.MainWindow.MainWindow вставить Win32Helpers.SeDebugPriviledge.Enable();

Классик надо включить в проект примера.

Возможно Михаил включит в S# раз у нескольких людей такая ошибка вылетает


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Win32Helpers
{
    using System.Runtime.InteropServices;

    public class SeDebugPriviledge
    {

        [DllImport("advapi32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool OpenProcessToken(IntPtr ProcessHandle,
            UInt32 DesiredAccess, out IntPtr TokenHandle);

        private static uint STANDARD_RIGHTS_REQUIRED = 0x000F0000;
        private static uint STANDARD_RIGHTS_READ = 0x00020000;
        private static uint TOKEN_ASSIGN_PRIMARY = 0x0001;
        private static uint TOKEN_DUPLICATE = 0x0002;
        private static uint TOKEN_IMPERSONATE = 0x0004;
        private static uint TOKEN_QUERY = 0x0008;
        private static uint TOKEN_QUERY_SOURCE = 0x0010;
        private static uint TOKEN_ADJUST_PRIVILEGES = 0x0020;
        private static uint TOKEN_ADJUST_GROUPS = 0x0040;
        private static uint TOKEN_ADJUST_DEFAULT = 0x0080;
        private static uint TOKEN_ADJUST_SESSIONID = 0x0100;
        private static uint TOKEN_READ = (STANDARD_RIGHTS_READ | TOKEN_QUERY);
        private static uint TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | TOKEN_ASSIGN_PRIMARY |
            TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY | TOKEN_QUERY_SOURCE |
            TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_GROUPS | TOKEN_ADJUST_DEFAULT |
            TOKEN_ADJUST_SESSIONID);

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr GetCurrentProcess();

        [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool LookupPrivilegeValue(string lpSystemName, string lpName,
            out LUID lpLuid);

        public const string SE_ASSIGNPRIMARYTOKEN_NAME = "SeAssignPrimaryTokenPrivilege";

        public const string SE_AUDIT_NAME = "SeAuditPrivilege";

        public const string SE_BACKUP_NAME = "SeBackupPrivilege";

        public const string SE_CHANGE_NOTIFY_NAME = "SeChangeNotifyPrivilege";

        public const string SE_CREATE_GLOBAL_NAME = "SeCreateGlobalPrivilege";

        public const string SE_CREATE_PAGEFILE_NAME = "SeCreatePagefilePrivilege";

        public const string SE_CREATE_PERMANENT_NAME = "SeCreatePermanentPrivilege";

        public const string SE_CREATE_SYMBOLIC_LINK_NAME = "SeCreateSymbolicLinkPrivilege";

        public const string SE_CREATE_TOKEN_NAME = "SeCreateTokenPrivilege";

        public const string SE_DEBUG_NAME = "SeDebugPrivilege";

        public const string SE_ENABLE_DELEGATION_NAME = "SeEnableDelegationPrivilege";

        public const string SE_IMPERSONATE_NAME = "SeImpersonatePrivilege";

        public const string SE_INC_BASE_PRIORITY_NAME = "SeIncreaseBasePriorityPrivilege";

        public const string SE_INCREASE_QUOTA_NAME = "SeIncreaseQuotaPrivilege";

        public const string SE_INC_WORKING_SET_NAME = "SeIncreaseWorkingSetPrivilege";

        public const string SE_LOAD_DRIVER_NAME = "SeLoadDriverPrivilege";

        public const string SE_LOCK_MEMORY_NAME = "SeLockMemoryPrivilege";

        public const string SE_MACHINE_ACCOUNT_NAME = "SeMachineAccountPrivilege";

        public const string SE_MANAGE_VOLUME_NAME = "SeManageVolumePrivilege";

        public const string SE_PROF_SINGLE_PROCESS_NAME = "SeProfileSingleProcessPrivilege";

        public const string SE_RELABEL_NAME = "SeRelabelPrivilege";

        public const string SE_REMOTE_SHUTDOWN_NAME = "SeRemoteShutdownPrivilege";

        public const string SE_RESTORE_NAME = "SeRestorePrivilege";

        public const string SE_SECURITY_NAME = "SeSecurityPrivilege";

        public const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";

        public const string SE_SYNC_AGENT_NAME = "SeSyncAgentPrivilege";

        public const string SE_SYSTEM_ENVIRONMENT_NAME = "SeSystemEnvironmentPrivilege";

        public const string SE_SYSTEM_PROFILE_NAME = "SeSystemProfilePrivilege";

        public const string SE_SYSTEMTIME_NAME = "SeSystemtimePrivilege";

        public const string SE_TAKE_OWNERSHIP_NAME = "SeTakeOwnershipPrivilege";

        public const string SE_TCB_NAME = "SeTcbPrivilege";

        public const string SE_TIME_ZONE_NAME = "SeTimeZonePrivilege";

        public const string SE_TRUSTED_CREDMAN_ACCESS_NAME = "SeTrustedCredManAccessPrivilege";

        public const string SE_UNDOCK_NAME = "SeUndockPrivilege";

        public const string SE_UNSOLICITED_INPUT_NAME = "SeUnsolicitedInputPrivilege";

        [StructLayout(LayoutKind.Sequential)]
        public struct LUID
        {
            public UInt32 LowPart;
            public Int32 HighPart;
        }

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool CloseHandle(IntPtr hHandle);

        public const UInt32 SE_PRIVILEGE_ENABLED_BY_DEFAULT = 0x00000001;
        public const UInt32 SE_PRIVILEGE_ENABLED = 0x00000002;
        public const UInt32 SE_PRIVILEGE_REMOVED = 0x00000004;
        public const UInt32 SE_PRIVILEGE_USED_FOR_ACCESS = 0x80000000;

        [StructLayout(LayoutKind.Sequential)]
        public struct TOKEN_PRIVILEGES
        {
            public UInt32 PrivilegeCount;
            public LUID Luid;
            public UInt32 Attributes;
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct LUID_AND_ATTRIBUTES
        {
            public LUID Luid;
            public UInt32 Attributes;
        }

        // Use this signature if you do not want the previous state
        [DllImport("advapi32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool AdjustTokenPrivileges(IntPtr TokenHandle,
           [MarshalAs(UnmanagedType.Bool)]bool DisableAllPrivileges,
           ref TOKEN_PRIVILEGES NewState,
           UInt32 Zero,
           IntPtr Null1,
           IntPtr Null2);

        static public bool Enable()
        {
            IntPtr hToken;
            LUID luidSEDebugNameValue;
            TOKEN_PRIVILEGES tkpPrivileges;

            if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, out hToken))
            {
                Console.WriteLine("OpenProcessToken() failed, error = {0} . SeDebugPrivilege is not available", Marshal.GetLastWin32Error());
                return false;
            }
            else
            {
                Console.WriteLine("OpenProcessToken() successfully");
            }

            if (!LookupPrivilegeValue(null, SE_DEBUG_NAME, out luidSEDebugNameValue))
            {
                Console.WriteLine("LookupPrivilegeValue() failed, error = {0} .SeDebugPrivilege is not available", Marshal.GetLastWin32Error());
                CloseHandle(hToken);
                return false;
            }
            else
            {
                Console.WriteLine("LookupPrivilegeValue() successfully");
            }

            tkpPrivileges.PrivilegeCount = 1;
            tkpPrivileges.Luid = luidSEDebugNameValue;
            tkpPrivileges.Attributes = SE_PRIVILEGE_ENABLED;

            if (!AdjustTokenPrivileges(hToken, false, ref tkpPrivileges, 0, IntPtr.Zero, IntPtr.Zero))
            {
                Console.WriteLine("LookupPrivilegeValue() failed, error = {0} .SeDebugPrivilege is not available", Marshal.GetLastWin32Error());
            }
            else
            {
                Console.WriteLine("SeDebugPrivilege is now available");
            }
            CloseHandle(hToken);
            return true;
        }
    }
}


Спасибо:

Mikhail Sukhov

Фотография
Дата: 17.02.2011
Ответить


pyhta4og: Аналогичная проблема.

При запуске SmartSample в debug-режиме под Visual Studio 2008

получаю Win32Exception "Access Denied" at System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited) at System.Diagnostics.Process.GetProcessHandle(Int32 access, Boolean throwIfExited) at System.Diagnostics.Process.Kill() at Ecng.Trading.Smart.SmartTrader.KillSmartComProcess() at Ecng.Trading.Smart.SmartTrader.OnConnect()

Если пускать .exe файл - ошибки нет.

Студия наверное не из под привилегированного аккаунта запускается. А следовательно и debug.

Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy