2009-11-20 2 views
1

Используя Process.Kill() из веб-приложения ASP.NET, я получаю исключение Win32Exception с текстом «Доступ запрещен».Убивать процесс Windows из приложения консоли C#: как установить разрешения?

Поиск в Интернете несколько раз позволял мне устанавливать разрешения. Однако я не очень хорошо понимаю систему пользователей Windows XP, чтобы знать, как начать работу.

В то время исключение генерируется, Thread.CurrentPrincipal.Identity имеет следующие видимые свойства:

  1. AuthenticationType = ""
  2. IsAuthenticated = "ложных"
  3. Name = ""

WindowsIdentity.GetCurrent() показывает, что я вошел в систему как «NAME \ ASPNET», но я не думаю, что это актуально.

Что мне нужно сделать? Могу ли я каким-то образом получить поток для входа в систему в качестве некоторого пользователя Windows?

+0

Итак ... это консольное приложение C# или приложение ASP.NET? Это имеет значение для ответа. –

+0

это приложение ASP.NET. однако я тоже могу сделать это из консольного приложения ... поэтому, если бы вы были так склонны помогать мне, учитывая обе возможности, я был бы очень обязан – HaterTot

ответ

1

Я думаю, что вы на правильном пути, проблема с «Access denied» связана с процессом ASP.NET, запущенным с пользователем ASPNET, который имеет ограниченные права, и это то, что вы получаете ошибку. Что вы можете сделать, так это настроить imersnation для вашего веб-приложения. Это можно сделать либо путем изменения web.config, либо в коде. Подробнее о олицетворения вы можете прочитать here

web.comfig является realtively просто, вам нужно добавить следующую строку в раздел system.web вашего web.config

<identity impersonate="true" userName="domain\user" password="password" /> 

пользователь должен иметь права администратора на сервер

, если вы хотите, чтобы выполнить олицетворение в коде ниже приведен пример того, как вы могли бы сделать это:

... 
WindowsImpersonationContext context = ImpersonateUser("domain", "user", "password"); 
// kill your process 
context.Undo(); 
... 

[DllImport("advapi32.dll")] 
private static extern bool LogonUser(
    String lpszUsername, String lpszDomain, String lpszPassword, 
    int dwLogonType, int dwLogonProvider, ref IntPtr phToken); 

[DllImport("advapi32.dll")] 
private static extern bool DuplicateToken(
    IntPtr ExistingTokenHandle, int ImpersonationLevel, 
    ref IntPtr DuplicateTokenHandle); 

[DllImport("kernel32.dll")] 
private static extern bool CloseHandle(IntPtr hObject); 


private enum SecurityImpersonationLevel 
{ 
    SecurityAnonymous, 
    SecurityIdentification, 
    SecurityImpersonation, 
    SecurityDelegation 
} 

private enum LogonTypes 
{ 
    LOGON32_PROVIDER_DEFAULT=0, 
    LOGON32_LOGON_INTERACTIVE=2, 
    LOGON32_LOGON_NETWORK=3, 
    LOGON32_LOGON_BATCH=4, 
    LOGON32_LOGON_SERVICE=5, 
    LOGON32_LOGON_UNLOCK=7, 
    LOGON32_LOGON_NETWORK_CLEARTEXT=8, 
    LOGON32_LOGON_NEW_CREDENTIALS=9 
} 

public static WindowsImpersonationContext ImpersonateUser(string domain, string username, string password) 
{ 
    WindowsImpersonationContext result = null; 
    IntPtr existingTokenHandle = IntPtr.Zero; 
    IntPtr duplicateTokenHandle = IntPtr.Zero; 

    try 
    { 
     if (LogonUser(username, domain, password, 
      (int)LogonTypes.LOGON32_LOGON_NETWORK_CLEARTEXT, (int)LogonTypes.LOGON32_PROVIDER_DEFAULT, 
      ref existingTokenHandle)) 
     { 
      if (DuplicateToken(existingTokenHandle, 
       (int)SecurityImpersonationLevel.SecurityImpersonation, 
       ref duplicateTokenHandle)) 
      { 
       WindowsIdentity newId = new WindowsIdentity(duplicateTokenHandle); 
       result = newId.Impersonate(); 
      } 
     } 
    } 
    finally 
    { 
     if (existingTokenHandle != IntPtr.Zero) 
      CloseHandle(existingTokenHandle); 
     if (duplicateTokenHandle != IntPtr.Zero) 
      CloseHandle(duplicateTokenHandle); 
    } 
    return result; 
} 

надежды этого помогает, считает

1

Вам необходимо запустить приложение C# в качестве пользователя с достаточными привилегиями.

Если вы не можете доверять ASP AppPool с такими привилегиями (вам не следует), вам нужно создать отдельную службу, которая выполняется под учетной записью с достаточными привилегиями, и иметь протокол между низкоприоритетным приложением и более высокопривилегированной службой для связи с целью уничтожения процесса.

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

+0

, но как я могу запустить приложение C# в качестве пользователя с достаточными привилегиями «? – HaterTot

+0

Вы предоставляете необходимые привилегии учетной записи, запускающей приложение, т.е. в NAME \ ASPNET, из приложения «Локальная политика безопасности» (в «Администрирование») и добавьте NAME \ ASPNET в привилегию «Отладка программ». См. Http://support.microsoft.com/kb/155075 –

+0

спасибо, чувак, это было полезно тоже – HaterTot

Смежные вопросы