Win32Exception: Отказано в доступе
Atom Ответить
16.05.2010


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

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

При вызове:
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

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

Теги:


Спасибо:




9 Ответов
Greene

Фотография
Благотворитель
Дата: 16.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