Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
10 / 10 / 2
Регистрация: 09.08.2010
Сообщений: 321
1

Запуск программы от имени администратора из-под пользовательской учетной записи

15.11.2017, 03:08. Показов 5141. Ответов 3

Author24 — интернет-сервис помощи студентам
Возможно ли как-то запустить сторонее приложение при клике по кнопке в WPF- приложении с правами администатора БЕЗ необходимого ввода пользователем логина и пароля администратора?

То есть, такие условия:
WPF приложение запускается пользователем с обычными правами доступа. Пользователь не имеет прав устанавливать программы на компьютере и запускать программы от имени администратора. WPF-приложение он запустит с обычными правами и в этом приложении он нажмет кнопку, которая запустит в фоновом процессе cmd от имени администратора.

Вся проблема, собственно, в том, что при попытке что-то запустить от имени администратора появляется модальное окно UAC (User Account Control) Windows на экране с предложением ввести логин и пароль администратора.
Можно ли как-то программно передавать UAC логин и пароль, пусть даже зашив их в программный код (понимаю, что это совершенно ненадежно), и при этом не показывая окна UAC или же, по меньшей мере, тут же передавая соответствующие логин и пароль администратора в форму UAC и программно давая разрешение на запуск cmd с повышенными правами? Или же только руками вводить и реализовать то, о чем я говорю, совсем без участия человека не получится?

Вот такой простой код позволяет инициировать запуск от имени администратора (fileName - имя файла (программы)):
C#
1
2
3
4
5
6
7
8
9
10
11
ProcessStartInfo processInfo = new ProcessStartInfo();
processInfo.Verb = "runas";
processInfo.FileName = fileName;
try
{
     Process.Start(processInfo);
}
catch (Win32Exception)
{
     //Do nothing. Probably the user canceled the UAC window
}
Однако он не дает возможности как-то манипулировать UAC.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2017, 03:08
Ответы с готовыми решениями:

Надо ли запускать программы от имени администратора под учетной админа с выключенным UAC?
Доброго здоровья. 1.подскажите надо ли запускать программы от имени администратора под учетной...

Не могу зайти под учетной записи администратора
Здравствуйте сегодня случился такой случай, у меня в оффисе локальная сеть со статическими...

Запуск программы от имени администратора
Добрый день! Такая ситуация. Работаю на фирме, компов не мало и у всех НЕТУ прав администратора...

Запуск программы от имени администратора
Здраствуйте! Пишу программу, которой в некоторых местах нужно создавать файлики. И, естественно,...

3
Администратор
Эксперт .NET
17019 / 13372 / 5217
Регистрация: 17.03.2014
Сообщений: 27,344
Записей в блоге: 1
15.11.2017, 06:38 2
William Blake, логин и пароль можно указать через свойства Domain, UserName и Password (SecureString). Не уберет ли это диалог. Попробуй и расскажи.
1
6 / 7 / 2
Регистрация: 10.01.2017
Сообщений: 59
15.11.2017, 18:06 3
Тут придется обходить UAC. Байпас делается с помощью AutoElevate. Попробую код набросать.
Нам пригодится WinApi функция:
C#
1
2
3
4
5
6
7
8
9
10
    public static class Kernel32
    {
        #region [PUBLIC]Methods
        [DllImport("kernel32.dll", EntryPoint = "Wow64EnableWow64FsRedirection")]
        public static extern bool EnableWow64FSRedirection(bool enable);
        [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool IsWow64Process([In] IntPtr hProcess, [Out] out bool lpSystemInfo);
        #endregion
    }
Далее сделаем класс для удобства.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    public enum AccountType { Unknown = -1, Administrator, User, Guest }
    public static class WindowsManager
    {
        #region [PUBLIC]Methods
        public static AccountType GetAccountType()
        {
            using (WindowsIdentity identity = WindowsIdentity.GetCurrent())
            {
                if (identity != null)
                {
                    WindowsPrincipal principal = new WindowsPrincipal(identity);
                    if (principal.IsInRole(WindowsBuiltInRole.Administrator)) return AccountType.Administrator;
                    if (principal.IsInRole(WindowsBuiltInRole.User)) return AccountType.User;
                    if (principal.IsInRole(WindowsBuiltInRole.Guest)) return AccountType.Guest;
                }
            }
            return AccountType.Unknown;
        }
        public static bool UACBypass(string path, string arguments = null)
        {
            try
            {
                using (RegistryKey subKey = Registry.CurrentUser.CreateSubKey("Software\\Classes\\ms-settings\\Shell\\Open\\command"))
                {
                    subKey.SetValue("DelegateExecute", string.Empty, RegistryValueKind.String);
                    subKey.SetValue(string.Empty, $"\"{path}\" {arguments}", RegistryValueKind.String);
                }
                Kernel32.EnableWow64FSRedirection(false);
                Process process = new Process() { StartInfo = new ProcessStartInfo() { FileName = "C:\\Windows\\System32\\fodhelper.exe" } };
                process.Start();
                process.WaitForExit();
                Kernel32.EnableWow64FSRedirection(true);
                Registry.CurrentUser.DeleteSubKey("Software\\Classes\\ms-settings\\Shell\\Open\\command");
                return true;
            }
            catch { return false; }
        }
        #endregion
    }
И просто необходимое накидываем в метод Main():
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    class Program
    {
        #region EntryPoint
        [STAThread]
        static void Main(string[] args)
        {
            if (WindowsManager.GetAccountType() != AccountType.Administrator)
            {
                if (WindowsManager.UACBypass(Process.GetCurrentProcess().MainModule.FileName)) return;
                else MessageBox.Show("An unexpected error occurred.", "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else Installer.Install(true);
        }
        #endregion
    }
1
10 / 10 / 2
Регистрация: 09.08.2010
Сообщений: 321
16.11.2017, 14:24  [ТС] 4
Спасибо, попробую в ближайшее время и отпишусь. Сегодня, к сожалению, не довелось, ворох дел был.

Добавлено через 16 часов 20 минут
Диалог не убрало. Вернее, убрало, но не запустило от имени администратора. Сейчас покажу код.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
return _deleteSelectedFilmCommand ?? (_deleteSelectedFilmCommand = new RelayCommand<Program>(film =>
                {
                    //string s = SelectedItemName;
                    Process proThis = new Process();
                    ProcessStartInfo psiThis = new ProcessStartInfo("cmd.exe", "/k choco install " + SelectedItem + " -y");
                    //psiThis.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                    psiThis.Verb = "runas";
                    //psiThis.Domain = "abc.com";
                    psiThis.UserName = "John";
                    String password = "qwerty";
                    var secure = new SecureString();
                    foreach (var c in password)
                    {
                        secure.AppendChar(c);
                    }
                    psiThis.Password = secure;
                    proThis.StartInfo = psiThis;
                    psiThis.UseShellExecute = true;// Здесь проблема
                    proThis.Start();
                    proThis.WaitForExit();
                    if (film == null) return;
                    AllowedPrograms.Remove(film);
                    _selectedItem = null;
                    RaisePropertyChanged(() => SelectedItem);
                }));
Компьютеры находятся в доменной зоне, локальный администратор отключен по умолчанию на всех компьютерах. Но есть администраторы в доменной зоне. Например, администратор John с паролем qwerty. От его имени я и хотел бы запустить программу cmd и выполнить в ней какой-то скрипт. Для того, чтобы запускать программу от имени другого пользователя, свойство ProcessStartInfo.UseShellExecute должно быть установлено в значение false. По крайней мере, при установленном true компилятор начинает ругаться и говорить, что нужно присвоить false. Но в случае false игнорируется свойство Verb = "runas" и не происходит запуска от имени администратора.
Если же присвоить UseShellExecute true, то будет появляться диалоговое окно UAC с предложеним ввести логин и пароль. Чего я хочу избежать. По крайней мере, хочу избежать, чтобы показывалось, что находится в полях модальной формы UAC и нельзя было копировать то, что в них.

В идеальном случае, конечно, хотелось бы с установленным в false UseShellExecute запусиить cmd. Есть какие-нибудь еще предложения?
0
16.11.2017, 14:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2017, 14:24
Помогаю со студенческими работами здесь

Запуск программы от имени администратора
Привет всем! Столкнулся с небольшой проблемой... Пишу прикладные программы на VB.NET и делаю для...

Запуск программы НЕ от имени администратора
Есть программа на C#, которая запускается всегда исключительно с правами администратора, и нужно,...

Запуск программы от имени администратора
Добрый день. Как через bat файл запустить программу от локального администратора без ввода пароля?...

Запуск программы от имени администратора
видел где-то один мануал, о том как запустить программу на c# автоматически с правами...

Запуск внешней программы от имени администратора
Есть интересный вопрос: понадобилось из делфи запустить внешний батник от имени администратора. ...

Батник на Запуск программы от имени администратора
Подскажите пожалуйста : сотрудник работает с правами пользователя, нужно запустить из под...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru