2016-01-26 15 views
12

У меня есть приложение C#, .Net 4.6.1 Windows Forms, работающее на платформах Windows Server (2008 или выше), которое должно быть «Запуск от имени администратора». Повышенные привилегии необходимы, потому что приложение изменяет права доступа пользователей к различным папкам (в случае, если это важно для корневого веб-сайта по умолчанию IIS).Обнаружение повышенных привилегий в Windows Server 2008 или выше

Мне не повезло в обнаружении, было ли приложение «Запуск от имени администратора». Если я запустить приложение в обычном режиме (т.е. не как администратор) следующий код

var isAdmin = WindowsIdentity.GetCurrent().Owner.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid); 

возвращает true но код, который изменяет некоторые права доступа пользователя на директории терпит неудачу с недостаточно привилегий Ошибка.

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

Другие попытки я сделал без успеха:

  • Использование GetTokenInformation метода внутри ADVAPI32.dll как предложено here
  • Добавление файла манифеста в приложение, где я поставил requestedExecutionLevel в requireAdministrator
в

Заранее благодарим за любую помощь.

+0

Как обходной путь, который вы могли бы изначально проверить, можете ли вы изменить права доступа в конкретной папке, а если нет, сообщите об этом пользователю о недостаточных правах. К сожалению, у меня нет прямого опыта использования такого кода и я не могу дать полезный ответ :( – Arvo

+0

Спасибо @Arvo. Я реализовал аналогичное обходное решение на данный момент. Все еще хотел бы найти ответ. – Mats

+0

Итак, что на самом деле произошло, когда вы использовали манифест ? –

ответ

2

Попробуйте изменить права доступа к известной папке, и если есть исключение, вы знаете, что программа не была запущена как администратор.

+0

Я думаю, что OP ищет более элегантный поскольку он уже получает недостаточную привилегию в соответствии с его вопросом. – Lemonseed

+1

I второй какой @Dave упомянутый выше. Я уже реализовал такую ​​работу. Но это не отвечает на мой вопрос. – Mats

+0

@ Matthias Насколько я вижу, сложно определить, запускается ли программа как администратор. Не уверен, что я действительно могу помочь вам больше.Что касается более элегантного решения, я не уверен, что есть что-то. Мне любопытно, почему явное изменение не сработало для вас? – Dave3of5

2

Должно работать следующее (надеюсь, у меня есть клиент Windows, и он работает со мной).

var Identity = WindowsIdentity.GetCurrent(); 
var Principal = new WindowsPrincipal(Identity); 
bool IsAdmin = Principal.IsInRole(WindowsBuiltInRole.Administrator); 
+0

Если вы добавите '|| Principal.IsInRole (0x200) 'в IsAdmin bool, он должен также обнаруживать админов домена, то же самое количество' 0x220' для локальных администраторов групп. [MSDN] (https://msdn.microsoft.com/en-us/library/86wd8zba%28v=vs.110%29.aspx) – Arena

+0

Я заявил в своем OP, что использовал этот код без успеха. – Mats

+0

Вы заявили, что '.Owner.IsWellKnown ...' был использован без успеха, приведенный выше код не был указан, вы пробовали этот конкретный код? Возможно, вы ищете только флаг «0x200», поскольку локальные администраторы не смогут изменять права UAC. – Arena