2010-03-26 2 views
1

У меня возникли проблемы с использованием олицетворения для удаления PerformanceCounterCategory с веб-сайта MVC. У меня есть статический класс, и когда приложение запускается, он проверяет, существует или нет PerformanceCounterCategory, и если он содержит правильные счетчики. Если нет, он удаляет категорию и создает ее снова с необходимыми счетчиками.Олицетворение - Доступ запрещен

Он отлично работает при запуске под встроенный веб-сервер Cassini, но когда я пытаюсь запустить его через IIS7 (Vista) я получаю следующее сообщение об ошибке:

Access is denied
Description:
An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details:
System.ComponentModel.Win32Exception: Access is denied

Мое использование кода:

var username = "user"; 
var password = "password"; 
var domain = "tempuri.org"; 

WindowsImpersonationContext impersonationContext; 

// if impersonation fails - return 
if (!ImpersonateValidUser(username, password, domain, out impersonationContext)) 
{ 
    throw new AuthenticationException("Impersonation failed"); 
} 

PerformanceCounterCategory.Delete(PerfCategory); 
UndoImpersonation(impersonationContext); 

олицетворения код из статьи MS ...

private static bool ImpersonateValidUser(string username, string password, 
    string domain, out WindowsImpersonationContext impersonationContext) 
{ 
    const int LOGON32_LOGON_INTERACTIVE = 2; 
    const int LOGON32_PROVIDER_DEFAULT = 0; 
    WindowsIdentity tempWindowsIdentity; 
    var token = IntPtr.Zero; 
    var tokenDuplicate = IntPtr.Zero; 

    if (RevertToSelf()) 
    { 
     if (LogonUserA(username, domain, password, 
      LOGON32_LOGON_INTERACTIVE, 
      LOGON32_PROVIDER_DEFAULT, ref token) != 0) 
     { 
      if (DuplicateToken(token, 2, ref tokenDuplicate) != 0) 
      { 
       tempWindowsIdentity = new WindowsIdentity(tokenDuplicate); 
       impersonationContext = tempWindowsIdentity.Impersonate(); 

       if (impersonationContext != null) 
       { 
        CloseHandle(token); 
        CloseHandle(tokenDuplicate); 
        return true; 
       } 
      } 
     } 
    } 

    if (token != IntPtr.Zero) 
     CloseHandle(token); 
    if (tokenDuplicate != IntPtr.Zero) 
     CloseHandle(tokenDuplicate); 

    impersonationContext = null; 
    return false; 
} 



[DllImport("advapi32.dll")] 
public static extern int LogonUserA(String lpszUserName, String lpszDomain, 
    String lpszPassword, int dwLogonType, int dwLogonProvider, 
    ref IntPtr phToken); 

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
public static extern int DuplicateToken(IntPtr hToken, int impersonationLevel, 
    ref IntPtr hNewToken); 

[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
public static extern bool RevertToSelf(); 

[DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
public static extern bool CloseHandle(IntPtr handle); 

брошена ошибка при переработ ng пытается выполнить команду PerformanceCounterCategory.Delete.

Update
В ответ на ответ Давиды я попытался следующее:

  1. создал новый локальный пользователь с именем PerfMonUser
  2. Добавлена ​​этот пользователем к "Performance Monitor Users" группы

Изменен: код:

var username = "PerfMonUser"; 
var password = "password"; 
var domain = Environment.MachineName; 

WindowsImpersonationContext impersonationContext; 

// if impersonation fails - return 
if (!ImpersonateValidUser(username, password, domain, out impersonationContext)) 
{ 
    throw new AuthenticationException("Impersonation failed"); 
} 

PerformanceCounterCategory.Delete(PerfCategory); 
UndoImpersonation(impersonationContext); 

... но я все еще получаю ошибку:

Exception Details: System.ComponentModel.Win32Exception: Access is denied

... на линии:

PerformanceCounterCategory.Delete(PerfCategory); 

ответ

2

Это потому, что PerformanceCounterCategory.Delete необходимо иметь либо права администратора или быть членом группы пользователей монитора производительности. См. MSDN.

По умолчанию Cassini работает под учетной записью пользователя NT AUTHORITY \ SYSTEM, что, очевидно, является администратором. Однако IIS работает под ограниченной учетной записью пользователя, поэтому у него не будет доступа к вызовам PerformanceCounter. Вы должны будете сделать своего пользователя «пользователем» либо членом пользователей монитора производительности, либо администратором.

+0

Вы сказали, что попробовали добавить пользователя в качестве члена группы контроля производительности. Вы пытались добавить этого пользователя в качестве администратора? Это должен быть ваш следующий шаг. Если это работает, то вы знаете, что олицетворение работает нормально, вам просто нужно редактировать разрешения. – sngregory

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