Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск процесса из .NET, ...с ограниченными правами 
:(
    Опции темы
YoD
Дата 2.1.2006, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 29.11.2004

Репутация: нет
Всего: нет



Така проблема.
Пишу программу на c#. Она будет 100% работать под администраторской учёткой. Но она должна будет запускать различные екзешники, которым надо предоставить ограниченные права: запускаемые программы не должны, например, ребутить комп, менять системное время, лезть в реестр и многое другое. Как это сделать?

Буду очень благодарен за фрагмент кода.
PM MAIL ICQ   Вверх
Void
Дата 2.1.2006, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



В .NET 2.0 у метода System.Diagnostics.Process.Start есть перегруженный вариант, принимающий имя пользователя и пароль.
В .NET 1.1 придется вызывать WinAPI ф-цию CreateProcessWithLogon через P/Invoke. Вот простой пример:

Код

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;

    [StructLayout(LayoutKind.Sequential)]
    struct STARTUPINFO
    {
        public int cb;
        public IntPtr Reserved;
        public string Desktop;
        public string Title;
        public int X, Y, XSize, YSize, XCountChars, YCountChars;
        public int FillAttribute, Flags;
        public int ShowWindow;
        public int Reserved2;
        public IntPtr Reserved3;
        public IntPtr StdInput, StdOutput, StdError;
    }

    [StructLayout(LayoutKind.Sequential)]
    struct PROCESS_INFORMATION
    {
        public IntPtr hProcess, hThread;
        public int ProcessId, ThreadId;
    }

    class ProcessManager
    {
        private const int SW_SHOWDEFAULT = 10;
        private const int LOGON32_LOGON_BATCH = 4;
        private const int LOGON32_PROVIDER_DEFAULT = 0;
        private const int LOGON_WITH_PROFILE = 1;
        
        [DllImport("advapi32.dll", EntryPoint="CreateProcessWithLogonW", SetLastError=true)]
        private static extern bool CreateProcessWithLogon(
            string Username, string Domain, string Password,
            int LogonFlags,
            string ApplicationName, string CommandLine,
            int CreationFlags,
            IntPtr Environment,
            string CurrentDirectory,
            ref STARTUPINFO StartupInfo,
            out PROCESS_INFORMATION ProcessInfo);
        
        [DllImport("kernel32.dll")]
        private static extern bool CloseHandle(IntPtr handle);

        public static Process CreateProcessAsUser(string username, string domain, string password,
            string application, string commandline) 
        {
            STARTUPINFO si = new STARTUPINFO();
            PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
            si.cb = Marshal.SizeOf(si);
            si.Reserved = IntPtr.Zero;
            si.Reserved2 = 0;
            si.Reserved3 = IntPtr.Zero;
            si.Flags = 0;
            si.Desktop = null;
            si.Title = null;
            if (!CreateProcessWithLogon(username, domain, password,
                LOGON_WITH_PROFILE, application, commandline, 0,
                IntPtr.Zero, null, ref si, out pi))
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }
            CloseHandle(pi.hThread);
            CloseHandle(pi.hProcess);
            return Process.GetProcessById(pi.ProcessId);
        }
    }

    class Test
    {
        [STAThread]
        static void Main(string[] args)
        {
            Process proc = null;
            try
            {
                proc = ProcessManager.CreateProcessAsUser("USER", "DOMAIN", "PASSWORD", "program.exe", null);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                if (proc != null)
                    proc.Close();
            }
        }
    }


Это сообщение отредактировал(а) Void - 2.1.2006, 18:42


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
mr.DUDA
Дата 2.1.2006, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Вообще-то, если программа написана для .NET, можно выставить ей права на доступ к реестру, файловой системе, сети и т.п., через конфиг-файл. Это может быть как machine.config, так и локальный конфиг программы. Можно также воспользоваться оснасткой ".NET Framework Configuration Tool (Mscorcfg.msc)". Подробнее о безопасности в .NET можно почитать на русском у Троелсена или тут.


--------------------
user posted image
PM MAIL WWW   Вверх
YoD
Дата 3.1.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 29.11.2004

Репутация: нет
Всего: нет



Что касается запуска Dot Net 2.0 и перегруженного метода Start: его я нашёл, но проблема в том, что у меня он генерирует исключение "отказано в доступе". Не даёт запускать приложение от имени ограниченной записи. Если попробывать запустить от имени администраторской - то всё нормально
PM MAIL ICQ   Вверх
YoD
Дата 3.1.2006, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 29.11.2004

Репутация: нет
Всего: нет



Цитата(Void @ 2.1.2006, 18:41)
В .NET 2.0 у метода System.Diagnostics.Process.Start есть перегруженный вариант, принимающий имя пользователя и пароль.
В .NET 1.1 придется вызывать WinAPI ф-цию CreateProcessWithLogon через P/Invoke. Вот простой пример:

Код

skiped

Странно, вбил этот исходник. Постоянно говорит, что "имя пользователя или пароль не опознаны". Хотя я правильно вроде всё вписал...
Добавлено @ 13:59
Цитата(mr @ 2.1.2006, 19:24)
Вообще-то, если программа написана для .NET, можно выставить ей права на доступ к реестру, файловой системе, сети и т.п., через конфиг-файл. Это может быть как machine.config, так и локальный конфиг программы. Можно также воспользоваться оснасткой ".NET Framework Configuration Tool (Mscorcfg.msc)". Подробнее о безопасности в .NET можно почитать на русском у Троелсена или тут.

Честно перекопал в MSDN всё, касающеесе этой темы, НО того чего нужно не нашёл. Там есть возможность подгрузать сборки, ограничивая им права (правда описание там есть, но нормального примера нету. по описанию не всё понял). Но как запустить неуправляемое приложение, давая ему ограниченные права, я там не нашёл.

Если тебе уже приходилось что-то подобное писать, подкинь исходник плз...

И если пример конфиг файла программы для ограничения прав у тебя есть, тоже кинь... Только тогда такое вопрос: если .NETовская программа запустится с таким конфигом, то будет ли ограничение прав распространяться на все процессы (даже неNETовские), запускаемые этой прогой?
PM MAIL ICQ   Вверх
Exception
Дата 3.1.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Цитата(YoD @ 3.1.2006, 14:55)
Но как запустить неуправляемое приложение, давая ему ограниченные права, я там не нашёл.

Это был вариант для
Цитата(mr @ 2.1.2006, 20:24)
Вообще-то, если программа написана для .NET

smile

Цитата(YoD @ 3.1.2006, 14:55)
если .NETовская программа запустится с таким конфигом, то будет ли ограничение прав распространяться на все процессы (даже неNETовские), запускаемые этой прогой?

Нет.

Цитата(YoD @ 3.1.2006, 14:55)
подкинь исходник

У меня работает:
Код

        Security.SecureString pwd = new Security.SecureString();
        pwd.AppendChar((char)"T");
        pwd.AppendChar((char)"E");
        pwd.AppendChar((char)"S");
        pwd.AppendChar((char)"T");
        Process.Start("e:\project;1.exe", "TestUser", pwd, "DANICH")

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0733 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.