Может ли ASP.NET выдавать себя за пользователя, чтобы удалить категорию счетчика производительности? - PullRequest
1 голос
/ 30 января 2009

Я считаю, что успешно выдал себя за свою учетную запись, запустив страницу ASP.NET на моем локальном компьютере.

Используя метод, описанный здесь , я успешно изменил WindowsIdentity.GetCurrent().Name с ASPNET на мою учетную запись домена.

Я могу успешно записать файл в файловой системе, доступ к которому разрешен ТОЛЬКО для моей учетной записи. Однако, когда я пытаюсь удалить категорию счетчика производительности, я получаю Доступ запрещен .
У меня есть аудит в ветви реестра, и он говорит мне, что MyMachine \ ASPNET не работает при доступе к объекту .

Вот код, на котором происходит сбой:

if ( PerformanceCounterCategory.Exists ( PerfmonCategory ) )
        PerformanceCounterCategory.Delete ( PerfmonCategory );

Ошибка при удалении вызова.

(Моя учетная запись - администратор, и я могу успешно запустить тот же код вне контекста ASP.NET).

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

Edit: Исключение: В доступе отказано Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении:

System.ComponentModel.Win32Exception: доступ запрещен

Работает с полным доверием.

Ответы [ 2 ]

2 голосов
/ 30 января 2009

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

1 голос
/ 30 января 2009

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

Я не уверен, почему вы захотите использовать вызовы Win32 API для своей олицетворения - я давно с этим не справился, но думаю, все, что вам нужно сделать, это использовать

WindowsIdentity.GetCurrent().Impersonate()

Чтобы было ясно, сначала вам нужно пройти аутентификацию в вашем веб-приложении с использованием аутентификации Windows, а затем вы сможете сделать вызов Impersonate ().

Метод Impersonate ()

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