Здравствуйте! У меня такой вопрос как назначить права доступа приложению к отключению служб Windows?
Вот в принципе код реализации отключения службы:
namespace StopService
{
class Program
{
static void Main(string[] args)
{
ServiceController sc;
string serviceName;
TimeSpan timeout = new TimeSpan(0, 0, 30);
OperatingSystem os;
os = Environment.OSVersion;
if (os.Platform != PlatformID.Win32NT)
{
throw new PlatformNotSupportedException("Для работы нужна OC Windows NT, 2000, XP или выше");
}
os = null;
// Имя сервиса
serviceName = "RemoteRegistry";
// создаем контроллер
sc = new ServiceController(serviceName);
// проверяем статус процессаif (sc.Status == ServiceControllerStatus.Running)
{
// процесс можно остановить?if (sc.CanStop)
{
Console.WriteLine("Останов сервиса {0}", serviceName);
sc.Stop();
try{
// подождем 30 секунд
sc.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
Console.WriteLine("Сервис {0} успешно останвлен", serviceName);
}
catch(System.ServiceProcess.TimeoutException)
{
Console.WriteLine("Не удалось остановить сервис {0}", serviceName);
}
}
else
{
Console.WriteLine("Сервис {0} не может быть остановлен",serviceName);
}
}
Console.ReadKey();
}
}
}
Как я понимаю права доступа назначаются в файле проекта AssemblyInfo.cs вот только вопрос как ? И какой класс использовать для назначения прав доступа ? Или возможно назначить права приложению , ну допустим администратора.
Здравствуйте, Xobotik, Вы писали:
X>Здравствуйте! У меня такой вопрос как назначить права доступа приложению к отключению служб Windows? X>Вот в принципе код реализации отключения службы:
X>Как я понимаю права доступа назначаются в файле проекта AssemblyInfo.cs вот только вопрос как ? И какой класс использовать для назначения прав доступа ? Или возможно назначить права приложению , ну допустим администратора.
Не совсем понял из вашего поста, отключение или остановка службы вам требуется? с какой целью оно нужно? а ваобше политики безопасности капайте, нескажу сейчас какой раздел, там политика на запуск/останов служб есть.
Подозреваю, что дело не в правах кода, а в правах учётной записи, от имени которой Вы этот код запускали. От имени кого Вы работали и в какой ОС? На счёт висты можно поискать в MSDN, а в более ранних ОС право остановки имели по умолчанию Power users и админы.
А права кода, если я правильно понял при довольно беглом пока знакомстве, определяются тем в какую Code group включена сборка, точнее какой Permission set этой группе назначен. И эти права не могут расширить права пользователя, только ограничить. А в конфигарации сборки, как я понимаю, указывается минимально необходимый данному коду уровень прав, без которого сборка не будет загружаться.
Здравствуйте, Мизантроп, Вы писали:
М>Здравствуйте, Xobotik, Вы писали:
М>Подозреваю, что дело не в правах кода, а в правах учётной записи, от имени которой Вы этот код запускали. От имени кого Вы работали и в какой ОС? На счёт висты можно поискать в MSDN, а в более ранних ОС право остановки имели по умолчанию Power users и админы.
М>А права кода, если я правильно понял при довольно беглом пока знакомстве, определяются тем в какую Code group включена сборка, точнее какой Permission set этой группе назначен. И эти права не могут расширить права пользователя, только ограничить. А в конфигарации сборки, как я понимаю, указывается минимально необходимый данному коду уровень прав, без которого сборка не будет загружаться.
Ну на теории спасибо , все понятно, а собственно как это практически реализовать, допустим я знаю как реализовать права доступа кода к реестру , но мне нужно права доступа на работу со службами , то есть остановка , отключение , запуск, нигде не нашел такого материала.
Здравствуйте, pumpurumer, Вы писали:
P>Здравствуйте, Xobotik, Вы писали:
X>>Здравствуйте! У меня такой вопрос как назначить права доступа приложению к отключению служб Windows? X>>Вот в принципе код реализации отключения службы:
X>>Как я понимаю права доступа назначаются в файле проекта AssemblyInfo.cs вот только вопрос как ? И какой класс использовать для назначения прав доступа ? Или возможно назначить права приложению , ну допустим администратора.
P>Не совсем понял из вашего поста, отключение или остановка службы вам требуется? с какой целью оно нужно? а ваобше политики безопасности капайте, нескажу сейчас какой раздел, там политика на запуск/останов служб есть.
То есть копать документацию MSDN, которая к Visual Studio прилагается?
А есть там разрешение приложению ну допустим аналог этого:
Здравствуйте, Мизантроп, Вы писали:
М>Здравствуйте, Xobotik, Вы писали:
М>Подозреваю, что дело не в правах кода, а в правах учётной записи, от имени которой Вы этот код запускали. От имени кого Вы работали и в какой ОС? На счёт висты можно поискать в MSDN, а в более ранних ОС право остановки имели по умолчанию Power users и админы.
М>А права кода, если я правильно понял при довольно беглом пока знакомстве, определяются тем в какую Code group включена сборка, точнее какой Permission set этой группе назначен. И эти права не могут расширить права пользователя, только ограничить. А в конфигарации сборки, как я понимаю, указывается минимально необходимый данному коду уровень прав, без которого сборка не будет загружаться.
Программа по останове служб работает, если через ОСь , то есть в свойствах .exe файла указать "Выполнить эту программу от имени администратора". Нашел информацию по разрешению прав на работу со службами здесь. Пробую реализовать в файле AssemblyInfo.cs:
Здравствуйте, Xobotik, Вы писали:
X>Пробую реализовать в файле AssemblyInfo.cs:
[...] X>Все равно ругается на недостатка прав когда я пытаюсь остановить службу, в коде то есть:
По-моему Вы смотрите на это немного не под тем углом Давайте попробуем с начала.
Какими-либо правами в системе обладает не программа. Правами обладает Учётная запись, упрощённо говоря, конкретный человек, осуществивший вход в систему путём ввода своего псевдонима и пароля. Этот человек в процессе работы запускает те или иные программы. Эти программы могут сделать только то, что в данной системе разрешено именно этому человеку. Нельзя сделать какими-то настройками программы, чтобы человек, входящий в группу обычных пользователей, смог бы выполнить какие-то действия, которые разрешены только администраторам.
К сожалению, в Vista система безопасности стала несколько сложнее для понимания при первоначальном знакомстве, чем это было в более ранних версиях.
Некоторые программы предназначены для выполняете действий по управлению системой, которые доступны только администраторам. Когда обычный пользователь пытается использовать такую программу, он получает ошибку "отказано в доступе". Если этот пользователь знает пароль администратора, то он может запустить эту программу от имени администратора двумя основными способами
Воспользовавшись сервисом RunAs, один из интерфейсов к которому — контекстное меню проводника
Войдя в систему как администратор обычным образом
Так было до Vista. В этой системе появились дополнительные ограничения. Если раньше, войдя в систему как администратор, Вы реально обладатели всеми правами администратора, то в этой системе Вы всё равно отаётесь ограничены в правах, так как система Вас ограничивает искуственно. Но чтобы всё-таки иметь возможность администрировать систему, должен быть способ снятия ограничений тогда, когда это необходимо. Этим Вы и воспользовались, когда сделали
в свойствах .exe файла указать "Выполнить эту программу от имени администратора"
Вы указали системе, что для нормальной работы данной программы необходимы неограниченные административные полномочия, что и позволило системе снять ограничения. Но только потому, что Вы являетесь членом группы администраторов. Если бы Вы были обычным пользователем и не знали пароля администратора, то это действие Вам нисколько бы не помогло, Ваша программа всё равно не смогла бы выполнить остановку сервиса.
X>Пробую реализовать в файле AssemblyInfo.cs
Я не в курсе, можно ли это сделать с помощью конфигурации, но зато можно с помощью манифеста, указав аттрибут Level тэга requestedExecutionLevel как requireAdministrator. Это вороде как имеет тот-же эффект, что указание вручную в свойствах файла. Но как я уже говорил, Вы никакими настройками конфигурации не сможете разрешить свой программе делать то, что запрещено запустившему её пользователю.
Здравствуйте, Мизантроп, Вы писали:
М>Здравствуйте, Xobotik, Вы писали:
X>>Пробую реализовать в файле AssemblyInfo.cs: М>[...] X>>Все равно ругается на недостатка прав когда я пытаюсь остановить службу, в коде то есть:
М>По-моему Вы смотрите на это немного не под тем углом Давайте попробуем с начала.
М>Какими-либо правами в системе обладает не программа. Правами обладает Учётная запись, упрощённо говоря, конкретный человек, осуществивший вход в систему путём ввода своего псевдонима и пароля. Этот человек в процессе работы запускает те или иные программы. Эти программы могут сделать только то, что в данной системе разрешено именно этому человеку. Нельзя сделать какими-то настройками программы, чтобы человек, входящий в группу обычных пользователей, смог бы выполнить какие-то действия, которые разрешены только администраторам.
М>К сожалению, в Vista система безопасности стала несколько сложнее для понимания при первоначальном знакомстве, чем это было в более ранних версиях. М>Некоторые программы предназначены для выполняете действий по управлению системой, которые доступны только администраторам. Когда обычный пользователь пытается использовать такую программу, он получает ошибку "отказано в доступе". Если этот пользователь знает пароль администратора, то он может запустить эту программу от имени администратора двумя основными способами М>
М> Воспользовавшись сервисом RunAs, один из интерфейсов к которому — контекстное меню проводника М> Войдя в систему как администратор обычным образом М>
М>Так было до Vista. В этой системе появились дополнительные ограничения. Если раньше, войдя в систему как администратор, Вы реально обладатели всеми правами администратора, то в этой системе Вы всё равно отаётесь ограничены в правах, так как система Вас ограничивает искуственно. Но чтобы всё-таки иметь возможность администрировать систему, должен быть способ снятия ограничений тогда, когда это необходимо. Этим Вы и воспользовались, когда сделали М>
М>в свойствах .exe файла указать "Выполнить эту программу от имени администратора"
М>Вы указали системе, что для нормальной работы данной программы необходимы неограниченные административные полномочия, что и позволило системе снять ограничения. Но только потому, что Вы являетесь членом группы администраторов. Если бы Вы были обычным пользователем и не знали пароля администратора, то это действие Вам нисколько бы не помогло, Ваша программа всё равно не смогла бы выполнить остановку сервиса.
X>>Пробую реализовать в файле AssemblyInfo.cs
М>Я не в курсе, можно ли это сделать с помощью конфигурации, но зато можно с помощью манифеста, указав аттрибут Level тэга requestedExecutionLevel как requireAdministrator. Это вороде как имеет тот-же эффект, что указание вручную в свойствах файла. Но как я уже говорил, Вы никакими настройками конфигурации не сможете разрешить свой программе делать то, что запрещено запустившему её пользователю.
Спасибо за то , что нашли время и ответили так исчерпывающе на мою проблему. но я все таки не понимаю, как же тогда допустим программа Auslogics BoostSpeed сделала доступ на отключение служб в Windows Vista. В принципе есть наверно возможность программно запросить разрешения у системы на работу со службами? И не только через манифест файл проекта.
Здравствуйте, Xobotik, Вы писали:
X> но я все таки не понимаю, как же тогда допустим программа Auslogics BoostSpeed сделала доступ на отключение служб в Windows Vista. В принципе есть наверно возможность программно запросить разрешения у системы на работу со службами? И не только через манифест файл проекта.
Разумеется, то, что делается через манифест, можно выполнить и программно. Технически ограничения выполнены так: при входе администратора для него создаётся полный маркер, как и в предыдущих версиях системы, но этот маркер не используется для запуска пользовательских процессов. Вместо этого из него делается ограниченный маркер (restricted token ), и к нему линкуется полный маркер. А уже этот ограниченный маркер используется для запуска программ. Получить программно полный маркер из фильтрованного можно с помощью GetTokenInformation с классом информации TokenLinkedToken. Полученный маркер можно использовать обычным образом, например передать в SetThreadToken или в ImpersonateLoggedOnUser.
Правда, я не знаю, есть ли в NET готовые средства для этих действий.
Здравствуйте, Мизантроп, Вы писали:
М>Кстати, вот и вот пара ссылок по теме манифеста.
Ошибка 1 выход из команды ""C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\..\..\SDK\v2.0\bin\mt.exe" -manifest "C:\Users\asus\Desktop\StopService\132423423\StopServicee\StopServicee\StopServicee.exe.manifest" –outputresource:"C:\Users\asus\Desktop\StopService\132423423\StopServicee\StopServicee\bin\Debug\StopServicee.exe";#1" с кодом 3. StopServicee
Ничего не получается, добавил манифест в приложение по ссылке: сама ссылка
Как раз ругается когда я в настройках сборки указываю: "$(DevEnvDir)..\..\SDK\v2.0\bin\mt.exe" -manifest "$(ProjectDir)$(TargetName).exe.manifest" –outputresource:"$(TargetDir)$(TargetFileName)";#1
Да и вообще что это за файл такой Mt? да и путь SDK\V2.0\bin такого нет у Visual Studio 2008
Да, ну и конечно может изменить дескриптор защиты службы, предоставив право выполнять операции с ней нужному пользователю, но я бы не рекомендовал это делать. Администрированием должен заниматься администратор, а разрешение этих действий другим пользователям может создать угрозу безопасности.
Здравствуйте, Мизантроп, Вы писали:
М>Здравствуйте, Мизантроп, Вы писали:
М>Да, ну и конечно может изменить дескриптор защиты службы, предоставив право выполнять операции с ней нужному пользователю, но я бы не рекомендовал это делать. Администрированием должен заниматься администратор, а разрешение этих действий другим пользователям может создать угрозу безопасности.
Спасибо огромное , все заработало , программа требует разрешение администратора=) вот только почему собственно ругается:
Ошибка 1 выход из команды "mt.exe -manifest "C:\Users\asus\Desktop\StopService\132423423\StopServicee\StopServicee\StopServicee.exe.manifest" -updateresource:"C:\Users\asus\Desktop\StopService\132423423\StopServicee\StopServicee\bin\Debug\StopServicee.exe;#1"" с кодом 9009. StopServicee
Здравствуйте, Xobotik, Вы писали:
X>Спасибо огромное , все заработало , программа требует разрешение администратора=) вот только почему собственно ругается: X>Ошибка 1 выход из команды "mt.exe -manifest "C:\Users\asus\Desktop\StopService\132423423\StopServicee\StopServicee\StopServicee.exe.manifest" -updateresource:"C:\Users\asus\Desktop\StopService\132423423\StopServicee\StopServicee\bin\Debug\StopServicee.exe;#1"" с кодом 9009. StopServicee
Честно говоря, я ей ни разу не пользовался Манифест — обычный ресурс, для его включения в нативное приложение достаточно одной строки в RC-файле. Но в Интернете по поводу этой ошибки пишут, что проблема в путях, и как простейшее решение предлагают добавить путь к mt.exe в переменную Path окружения и вызывать без указания пути. Либо можно попробовать вставить эту команду в батник и вызывать этот батник.
Сейчас проверил ради любопытства. Путь этот у меня давно в Path, в post-build указал строку mt.exe –manifest WindowsApplication1.exe.manifest -outputresource:WindowsApplication1.exe;1 — отработала на ура, заглянул в ресурсы полученного экзешника — есть манифест.
Я предпочитаю для нативных приложений включать в ресурс, но насколько помню, манифест можно просто положить рядом с исполняемым файлом. Правда при этом в ресурсах этого файла манифеста быть не должно.
Здравствуйте, Мизантроп, Вы писали:
М>Здравствуйте, Xobotik, Вы писали:
X>>Спасибо огромное , все заработало , программа требует разрешение администратора=) вот только почему собственно ругается: X>>Ошибка 1 выход из команды "mt.exe -manifest "C:\Users\asus\Desktop\StopService\132423423\StopServicee\StopServicee\StopServicee.exe.manifest" -updateresource:"C:\Users\asus\Desktop\StopService\132423423\StopServicee\StopServicee\bin\Debug\StopServicee.exe;#1"" с кодом 9009. StopServicee
М>Честно говоря, я ей ни разу не пользовался Манифест — обычный ресурс, для его включения в нативное приложение достаточно одной строки в RC-файле. Но в Интернете по поводу этой ошибки пишут, что проблема в путях, и как простейшее решение предлагают добавить путь к mt.exe в переменную Path окружения и вызывать без указания пути. Либо можно попробовать вставить эту команду в батник и вызывать этот батник.
М>Сейчас проверил ради любопытства. Путь этот у меня давно в Path, в post-build указал строку mt.exe –manifest WindowsApplication1.exe.manifest -outputresource:WindowsApplication1.exe;1 — отработала на ура, заглянул в ресурсы полученного экзешника — есть манифест.
М>Я предпочитаю для нативных приложений включать в ресурс, но насколько помню, манифест можно просто положить рядом с исполняемым файлом. Правда при этом в ресурсах этого файла манифеста быть не должно.
Ошибка 1 выход из команды "mt.exe –manifest SystemProtection.exe.manifest -outputresource:SystemProtection.exe;1" с кодом 9009. SystemProtection
У меня опять же таже самая ошибка. Не могу понять из-за чего она возникает. Вы можете пожалуйста расписать, как вы это делаете, то есть вот добавление пути. В принципе ошибка возникает, но приложение которое с компилировалось работает на ура, и останавливает и запускает службы и перед началом работы запрашивает разрешение на работу.
Здравствуйте, Xobotik, Вы писали:
X>У меня опять же таже самая ошибка. Не могу понять из-за чего она возникает. Вы можете пожалуйста расписать, как вы это делаете, то есть вот добавление пути. В принципе ошибка возникает, но приложение которое с компилировалось работает на ура, и останавливает и запускает службы и перед началом работы запрашивает разрешение на работу.
Да, конечно. В принципе я ничего и не делал, для проверки пошёл по простейшему пути. Сначала запустил CMD и набрал в нём mt. Получил вывод в консоль справки этой утилиты, из чего сделал вывод, что она лежит в одной из директорий, путь к которой присутствует в переменной окружения Path, поэтому специально искать её не стал Далее скопировал файл манифеста в директорию Debug\Bin проекта WindowsApplication1 и переименовал его в WindowsApplication1.exe.manifest. Затем открыл свойства проекта и на вкладке Build events в окно Post-build event command line ввёл строку mt.exe –manifest WindowsApplication1.exe.manifest -outputresource:WindowsApplication1.exe;1
Это скопировано прямо оттуда. Условием её запуска выбрал успешную компиляцию.
Потом нажал Shift+F6 и в окне Output после сообщения об успешной компиляции получил следующее
WindowsApplication1 -> D:\Documents and Settings\User\Мои документы\Visual Studio 2005\Projects\WinForms1\WinFormsSolution\WindowsApplication1\bin\Debug\WindowsApplication1.exe
mt.exe –manifest WindowsApplication1.exe.manifest -outputresource:WindowsApplication1.exe;1
Microsoft (R) Manifest Tool version 6.0.4071.0
Здравствуйте, Xobotik, Вы писали:
X>то есть вот добавление пути.
Хм, не уверен, что верно Вас понял, но на всякий случай:
Находите директорию, в которой лежит mt.exe, любым образом, хоть поиском по папкам. Копируете в буфер обмена полное имя этой директории. Открываете свойства системы и на вкладке дополнительно видите кнопку переменные среды, нажимаете её. Открывается окно с двумя списками переменных окружения — общесистемным и текущего пользователя. Добавлять можно в любую, как Вам удобнее, при создания окружения пользователя они объединяются. Находите в списке переменную Path и нажимаете изменить. Откроется диалог с именем переменной и её значением. В самый конец значения добавьте точку с запятой и вставьте из буфера путь. Нажмите Ок, на этом всё. Если добавили в общесистемную, то нужно перезагрузиться, если в пользовательскую, то достаточно перелогиниться.