Права доступа на отключение служб Windows
От: Xobotik Россия  
Дата: 02.10.09 22:28
Оценка:
Здравствуйте! У меня такой вопрос как назначить права доступа приложению к отключению служб 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 вот только вопрос как ? И какой класс использовать для назначения прав доступа ? Или возможно назначить права приложению , ну допустим администратора.

Заранее спасибо!
С уважением!
Re: Права доступа на отключение служб Windows
От: pumpurumer  
Дата: 02.10.09 23:47
Оценка: 3 (1)
Здравствуйте, Xobotik, Вы писали:

X>Здравствуйте! У меня такой вопрос как назначить права доступа приложению к отключению служб Windows?

X>Вот в принципе код реализации отключения службы:

X>Как я понимаю права доступа назначаются в файле проекта AssemblyInfo.cs вот только вопрос как ? И какой класс использовать для назначения прав доступа ? Или возможно назначить права приложению , ну допустим администратора.


Не совсем понял из вашего поста, отключение или остановка службы вам требуется? с какой целью оно нужно? а ваобше политики безопасности капайте, нескажу сейчас какой раздел, там политика на запуск/останов служб есть.
Re: Права доступа на отключение служб Windows
От: Мизантроп  
Дата: 03.10.09 04:58
Оценка: 3 (1)
Здравствуйте, Xobotik, Вы писали:

Подозреваю, что дело не в правах кода, а в правах учётной записи, от имени которой Вы этот код запускали. От имени кого Вы работали и в какой ОС? На счёт висты можно поискать в MSDN, а в более ранних ОС право остановки имели по умолчанию Power users и админы.

А права кода, если я правильно понял при довольно беглом пока знакомстве, определяются тем в какую Code group включена сборка, точнее какой Permission set этой группе назначен. И эти права не могут расширить права пользователя, только ограничить. А в конфигарации сборки, как я понимаю, указывается минимально необходимый данному коду уровень прав, без которого сборка не будет загружаться.
"Нормальные герои всегда идут в обход!"
Re[2]: Права доступа на отключение служб Windows
От: Xobotik Россия  
Дата: 04.10.09 07:01
Оценка:
Здравствуйте, Мизантроп, Вы писали:

М>Здравствуйте, Xobotik, Вы писали:


М>Подозреваю, что дело не в правах кода, а в правах учётной записи, от имени которой Вы этот код запускали. От имени кого Вы работали и в какой ОС? На счёт висты можно поискать в MSDN, а в более ранних ОС право остановки имели по умолчанию Power users и админы.


М>А права кода, если я правильно понял при довольно беглом пока знакомстве, определяются тем в какую Code group включена сборка, точнее какой Permission set этой группе назначен. И эти права не могут расширить права пользователя, только ограничить. А в конфигарации сборки, как я понимаю, указывается минимально необходимый данному коду уровень прав, без которого сборка не будет загружаться.


Ну на теории спасибо , все понятно, а собственно как это практически реализовать, допустим я знаю как реализовать права доступа кода к реестру , но мне нужно права доступа на работу со службами , то есть остановка , отключение , запуск, нигде не нашел такого материала.
С уважением!
Re[2]: Права доступа на отключение служб Windows
От: Xobotik Россия  
Дата: 04.10.09 07:07
Оценка:
Здравствуйте, pumpurumer, Вы писали:

P>Здравствуйте, Xobotik, Вы писали:


X>>Здравствуйте! У меня такой вопрос как назначить права доступа приложению к отключению служб Windows?

X>>Вот в принципе код реализации отключения службы:

X>>Как я понимаю права доступа назначаются в файле проекта AssemblyInfo.cs вот только вопрос как ? И какой класс использовать для назначения прав доступа ? Или возможно назначить права приложению , ну допустим администратора.


P>Не совсем понял из вашего поста, отключение или остановка службы вам требуется? с какой целью оно нужно? а ваобше политики безопасности капайте, нескажу сейчас какой раздел, там политика на запуск/останов служб есть.


То есть копать документацию MSDN, которая к Visual Studio прилагается?

А есть там разрешение приложению ну допустим аналог этого:
С уважением!
Re[2]: Права доступа на отключение служб Windows
От: Xobotik Россия  
Дата: 04.10.09 09:37
Оценка:
Здравствуйте, Мизантроп, Вы писали:

М>Здравствуйте, Xobotik, Вы писали:


М>Подозреваю, что дело не в правах кода, а в правах учётной записи, от имени которой Вы этот код запускали. От имени кого Вы работали и в какой ОС? На счёт висты можно поискать в MSDN, а в более ранних ОС право остановки имели по умолчанию Power users и админы.


М>А права кода, если я правильно понял при довольно беглом пока знакомстве, определяются тем в какую Code group включена сборка, точнее какой Permission set этой группе назначен. И эти права не могут расширить права пользователя, только ограничить. А в конфигарации сборки, как я понимаю, указывается минимально необходимый данному коду уровень прав, без которого сборка не будет загружаться.


Программа по останове служб работает, если через ОСь , то есть в свойствах .exe файла указать "Выполнить эту программу от имени администратора". Нашел информацию по разрешению прав на работу со службами здесь. Пробую реализовать в файле AssemblyInfo.cs:

...
[assembly: System.ServiceProcess.ServiceControllerPermission(System.Security.Permissions.SecurityAction.RequestMinimum,PermissionAccess=ServiceControllerPermissionAccess.Control)]
...


Все равно ругается на недостатка прав когда я пытаюсь остановить службу, в коде то есть:

...
sc.Stop();
...


Может быть я что-то не то делаю.
С уважением!
Re[3]: Права доступа на отключение служб Windows
От: Мизантроп  
Дата: 04.10.09 10:54
Оценка: 3 (1)
Здравствуйте, Xobotik, Вы писали:

X>Пробую реализовать в файле AssemblyInfo.cs:

[...]
X>Все равно ругается на недостатка прав когда я пытаюсь остановить службу, в коде то есть:

По-моему Вы смотрите на это немного не под тем углом Давайте попробуем с начала.

Какими-либо правами в системе обладает не программа. Правами обладает Учётная запись, упрощённо говоря, конкретный человек, осуществивший вход в систему путём ввода своего псевдонима и пароля. Этот человек в процессе работы запускает те или иные программы. Эти программы могут сделать только то, что в данной системе разрешено именно этому человеку. Нельзя сделать какими-то настройками программы, чтобы человек, входящий в группу обычных пользователей, смог бы выполнить какие-то действия, которые разрешены только администраторам.

К сожалению, в Vista система безопасности стала несколько сложнее для понимания при первоначальном знакомстве, чем это было в более ранних версиях.
Некоторые программы предназначены для выполняете действий по управлению системой, которые доступны только администраторам. Когда обычный пользователь пытается использовать такую программу, он получает ошибку "отказано в доступе". Если этот пользователь знает пароль администратора, то он может запустить эту программу от имени администратора двумя основными способами

Так было до Vista. В этой системе появились дополнительные ограничения. Если раньше, войдя в систему как администратор, Вы реально обладатели всеми правами администратора, то в этой системе Вы всё равно отаётесь ограничены в правах, так как система Вас ограничивает искуственно. Но чтобы всё-таки иметь возможность администрировать систему, должен быть способ снятия ограничений тогда, когда это необходимо. Этим Вы и воспользовались, когда сделали

в свойствах .exe файла указать "Выполнить эту программу от имени администратора"

Вы указали системе, что для нормальной работы данной программы необходимы неограниченные административные полномочия, что и позволило системе снять ограничения. Но только потому, что Вы являетесь членом группы администраторов. Если бы Вы были обычным пользователем и не знали пароля администратора, то это действие Вам нисколько бы не помогло, Ваша программа всё равно не смогла бы выполнить остановку сервиса.

X>Пробую реализовать в файле AssemblyInfo.cs


Я не в курсе, можно ли это сделать с помощью конфигурации, но зато можно с помощью манифеста, указав аттрибут Level тэга requestedExecutionLevel как requireAdministrator. Это вороде как имеет тот-же эффект, что указание вручную в свойствах файла. Но как я уже говорил, Вы никакими настройками конфигурации не сможете разрешить свой программе делать то, что запрещено запустившему её пользователю.
"Нормальные герои всегда идут в обход!"
Re[4]: Права доступа на отключение служб Windows
От: Мизантроп  
Дата: 04.10.09 11:02
Оценка:
Кстати, вот и вот пара ссылок по теме манифеста.
"Нормальные герои всегда идут в обход!"
Re[4]: Права доступа на отключение служб Windows
От: Xobotik Россия  
Дата: 04.10.09 17:57
Оценка:
Здравствуйте, Мизантроп, Вы писали:

М>Здравствуйте, Xobotik, Вы писали:


X>>Пробую реализовать в файле AssemblyInfo.cs:

М>[...]
X>>Все равно ругается на недостатка прав когда я пытаюсь остановить службу, в коде то есть:

М>По-моему Вы смотрите на это немного не под тем углом Давайте попробуем с начала.


М>Какими-либо правами в системе обладает не программа. Правами обладает Учётная запись, упрощённо говоря, конкретный человек, осуществивший вход в систему путём ввода своего псевдонима и пароля. Этот человек в процессе работы запускает те или иные программы. Эти программы могут сделать только то, что в данной системе разрешено именно этому человеку. Нельзя сделать какими-то настройками программы, чтобы человек, входящий в группу обычных пользователей, смог бы выполнить какие-то действия, которые разрешены только администраторам.


М>К сожалению, в Vista система безопасности стала несколько сложнее для понимания при первоначальном знакомстве, чем это было в более ранних версиях.

М>Некоторые программы предназначены для выполняете действий по управлению системой, которые доступны только администраторам. Когда обычный пользователь пытается использовать такую программу, он получает ошибку "отказано в доступе". Если этот пользователь знает пароль администратора, то он может запустить эту программу от имени администратора двумя основными способами
М>
М>Так было до Vista. В этой системе появились дополнительные ограничения. Если раньше, войдя в систему как администратор, Вы реально обладатели всеми правами администратора, то в этой системе Вы всё равно отаётесь ограничены в правах, так как система Вас ограничивает искуственно. Но чтобы всё-таки иметь возможность администрировать систему, должен быть способ снятия ограничений тогда, когда это необходимо. Этим Вы и воспользовались, когда сделали

М>

М>в свойствах .exe файла указать "Выполнить эту программу от имени администратора"

М>Вы указали системе, что для нормальной работы данной программы необходимы неограниченные административные полномочия, что и позволило системе снять ограничения. Но только потому, что Вы являетесь членом группы администраторов. Если бы Вы были обычным пользователем и не знали пароля администратора, то это действие Вам нисколько бы не помогло, Ваша программа всё равно не смогла бы выполнить остановку сервиса.

X>>Пробую реализовать в файле AssemblyInfo.cs


М>Я не в курсе, можно ли это сделать с помощью конфигурации, но зато можно с помощью манифеста, указав аттрибут Level тэга requestedExecutionLevel как requireAdministrator. Это вороде как имеет тот-же эффект, что указание вручную в свойствах файла. Но как я уже говорил, Вы никакими настройками конфигурации не сможете разрешить свой программе делать то, что запрещено запустившему её пользователю.


Спасибо за то , что нашли время и ответили так исчерпывающе на мою проблему. но я все таки не понимаю, как же тогда допустим программа Auslogics BoostSpeed сделала доступ на отключение служб в Windows Vista. В принципе есть наверно возможность программно запросить разрешения у системы на работу со службами? И не только через манифест файл проекта.
С уважением!
w
Re[5]: Права доступа на отключение служб Windows
От: Мизантроп  
Дата: 04.10.09 18:41
Оценка:
Здравствуйте, Xobotik, Вы писали:

X> но я все таки не понимаю, как же тогда допустим программа Auslogics BoostSpeed сделала доступ на отключение служб в Windows Vista. В принципе есть наверно возможность программно запросить разрешения у системы на работу со службами? И не только через манифест файл проекта.


Разумеется, то, что делается через манифест, можно выполнить и программно. Технически ограничения выполнены так: при входе администратора для него создаётся полный маркер, как и в предыдущих версиях системы, но этот маркер не используется для запуска пользовательских процессов. Вместо этого из него делается ограниченный маркер (restricted token ), и к нему линкуется полный маркер. А уже этот ограниченный маркер используется для запуска программ. Получить программно полный маркер из фильтрованного можно с помощью GetTokenInformation с классом информации TokenLinkedToken. Полученный маркер можно использовать обычным образом, например передать в SetThreadToken или в ImpersonateLoggedOnUser.

Правда, я не знаю, есть ли в NET готовые средства для этих действий.
"Нормальные герои всегда идут в обход!"
Re[5]: Права доступа на отключение служб Windows
От: Xobotik Россия  
Дата: 04.10.09 18:42
Оценка:
Здравствуйте, Мизантроп, Вы писали:

М>Кстати, вот и вот пара ссылок по теме манифеста.


Ошибка 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
С уважением!
Re[6]: Права доступа на отключение служб Windows
От: Мизантроп  
Дата: 04.10.09 18:45
Оценка:
Здравствуйте, Мизантроп, Вы писали:

Да, ну и конечно может изменить дескриптор защиты службы, предоставив право выполнять операции с ней нужному пользователю, но я бы не рекомендовал это делать. Администрированием должен заниматься администратор, а разрешение этих действий другим пользователям может создать угрозу безопасности.
"Нормальные герои всегда идут в обход!"
Re[7]: Права доступа на отключение служб Windows
От: Xobotik Россия  
Дата: 04.10.09 18:56
Оценка:
Здравствуйте, Мизантроп, Вы писали:

М>Здравствуйте, Мизантроп, Вы писали:


М>Да, ну и конечно может изменить дескриптор защиты службы, предоставив право выполнять операции с ней нужному пользователю, но я бы не рекомендовал это делать. Администрированием должен заниматься администратор, а разрешение этих действий другим пользователям может создать угрозу безопасности.


Спасибо огромное , все заработало , программа требует разрешение администратора=) вот только почему собственно ругается:
Ошибка 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
С уважением!
Re[8]: Права доступа на отключение служб Windows
От: Мизантроп  
Дата: 05.10.09 02:03
Оценка:
Здравствуйте, 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 — отработала на ура, заглянул в ресурсы полученного экзешника — есть манифест.

Я предпочитаю для нативных приложений включать в ресурс, но насколько помню, манифест можно просто положить рядом с исполняемым файлом. Правда при этом в ресурсах этого файла манифеста быть не должно.
"Нормальные герои всегда идут в обход!"
Re[9]: Права доступа на отключение служб Windows
От: Xobotik Россия  
Дата: 05.10.09 15:39
Оценка:
Здравствуйте, Мизантроп, Вы писали:

М>Здравствуйте, 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
У меня опять же таже самая ошибка. Не могу понять из-за чего она возникает. Вы можете пожалуйста расписать, как вы это делаете, то есть вот добавление пути. В принципе ошибка возникает, но приложение которое с компилировалось работает на ура, и останавливает и запускает службы и перед началом работы запрашивает разрешение на работу.
С уважением!
Re[10]: Права доступа на отключение служб Windows
От: Мизантроп  
Дата: 05.10.09 17:35
Оценка:
Здравствуйте, 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

Copyright (c) Microsoft Corporation 2004.

All rights reserved.

========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========

Далее открыл полученный экзешник Ресторатором и увидел там манифест (тип ресурса 24, идентификатор 1). Одно замечание — всё это делалось в VS2005.
"Нормальные герои всегда идут в обход!"
Re[10]: Права доступа на отключение служб Windows
От: Мизантроп  
Дата: 05.10.09 18:01
Оценка:
Здравствуйте, Xobotik, Вы писали:

X>то есть вот добавление пути.


Хм, не уверен, что верно Вас понял, но на всякий случай:

Находите директорию, в которой лежит mt.exe, любым образом, хоть поиском по папкам. Копируете в буфер обмена полное имя этой директории. Открываете свойства системы и на вкладке дополнительно видите кнопку переменные среды, нажимаете её. Открывается окно с двумя списками переменных окружения — общесистемным и текущего пользователя. Добавлять можно в любую, как Вам удобнее, при создания окружения пользователя они объединяются. Находите в списке переменную Path и нажимаете изменить. Откроется диалог с именем переменной и её значением. В самый конец значения добавьте точку с запятой и вставьте из буфера путь. Нажмите Ок, на этом всё. Если добавили в общесистемную, то нужно перезагрузиться, если в пользовательскую, то достаточно перелогиниться.

Вроде всё. Да, всё сказанное — для WinXp.
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.