На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Как программе получить права администратора во время ее выполнения
    Добрый вечер!
    Программа первоначально запускается под обычным пользователем.
    Затем ей необходимо операции, для которых требуются админские права.
    Можно ли программно получить - с запросом логина/пароля от ОС также как это делается при запуске программы сразу с "Run as Administrator" ?

    Самое простое решение, наверное - запустить свою копию по типу "Run as Administrator",
    но меня интересует - без перезапуска - можно это сделать, а если да, то как ?
      Увы, нет. Для получения повышенных прав требуется добавление привилегий в токен приложения, но такой возможности не существует. Привилегию можно разрешить, запретить или удалить из токена, но добавить её невозможно. Для этого нужно создать новый токен, уже имеющий нужную привилегию, пусть и отключённую по дефолту, однако созданный т.о. токен не может быть назначен уже имеющемуся процессу, если только он не сервис. Новый процесс на его основе можно создать, однако для обычного пользователя даже создание токена с повышенными привилегиями непосильная задача: для добавления в токен привилегий нужно уже обладать как минимум этими привилегиями.

      P.S. Не следует путать привилегии и права доступа. Это разные вещи. Права доступа относятся к действиям с объектами ОС, привилегии же определяют действия, не связанные с объектами. Например, отладка процессов, перезагрузка итп.

      Добавлено
      P.P.S. Кажется слишком строго, однако отсутствие такой возможности грамотное решение. В противном случае любой процесс бесконтрольно мог бы повышать свои привилегии без вмешательства пользователей, и грош цена такой ОСи.
      Сообщение отредактировано: Qraizer -
        Qraizer, спасибо!

        А каким образом программа может узнать запущена она под админом или нет ?

        И каким образом она может перезапуститься уже под администратором ?
          ChatGPT рекомендуэ :lol:

          Цитата Lun2 @
          А каким образом программа может узнать запущена она под админом или нет ?

          ExpandedWrap disabled
            #include <windows.h>
            #include <stdio.h>
             
            BOOL IsRunAsAdmin()
            {
                BOOL   fIsRunAsAdmin = FALSE;
                DWORD  dwError = 0;
                PSID   pAdministratorsGroup = NULL;
             
                // Получаем SID группы "Administrators" (BUILTIN\Administrators)
                SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
                if (!AllocateAndInitializeSid(&NtAuthority, 2,
                                              SECURITY_BUILTIN_DOMAIN_RID,
                                              DOMAIN_ALIAS_RID_ADMINS,
                                              0, 0, 0, 0, 0, 0,
                                              &pAdministratorsGroup))
                    return FALSE;
             
                // Проверяем, входит ли текущий токен в эту группу и включена ли привилегия
                if (!CheckTokenMembership(NULL, pAdministratorsGroup, &fIsRunAsAdmin))
                {
                    dwError = GetLastError();
                    fIsRunAsAdmin = FALSE;
                }
             
                if (pAdministratorsGroup)
                    FreeSid(pAdministratorsGroup);
             
                return fIsRunAsAdmin;
            }

          Цитата Lun2 @
          И каким образом она может перезапуститься уже под администратором ?

          ExpandedWrap disabled
            #include <windows.h>
            #include <shellapi.h>
            #pragma comment(lib, "shell32.lib")
             
            BOOL ElevateCurrentProcess()
            {
                wchar_t szPath[MAX_PATH];
                if (GetModuleFileNameW(NULL, szPath, ARRAYSIZE(szPath)) == 0)
                    return FALSE;
             
                SHELLEXECUTEINFOW sei = { sizeof(sei) };
                sei.lpVerb = L"runas";              // запрос UAC
                sei.lpFile = szPath;                // путь к нашему exe
                sei.hwnd   = NULL;
                sei.nShow  = SW_NORMAL;
             
                // Можно передать параметры, если нужно
                // sei.lpParameters = L"--some-param";
             
                if (ShellExecuteExW(&sei))
                {
                    // Успешно запустили elevated версию — можно завершиться
                    return TRUE;
                }
                else
                {
                    DWORD dwError = GetLastError();
                    if (dwError == ERROR_CANCELLED) // пользователь нажал "Нет" в UAC
                        MessageBoxW(NULL, L"Требуются права администратора!", L"Ошибка", MB_ICONERROR);
                    return FALSE;
                }
            }

          Чтобы UAC вообще показывал кнопку «Запуск от имени администратора», в exe должен быть встроен манифест с requireAdministrator или asInvoker. Самый простой способ — добавить в проект файл app.manifest с:

          ExpandedWrap disabled
            <requestedExecutionLevel level="asInvoker" uiAccess="false"/>

          или

          ExpandedWrap disabled
            <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>

          Вощем - копай в эту сторону! ИИ часто помогает, но и не менее часто несёт лютую пургу.
            Цитата Lun2 @
            И каким образом она может перезапуститься уже под администратором ?

            Наверное, так:
            ExpandedWrap disabled
               ::CreateProcessWithLogonW (...);

            И не только под администратором, а вообще под любым юзером.
            Надо указать юзера, пароль и командную строку.
            Диалог ввода юзера и пароля надо самому смастерить (если нужно).
            Сообщение отредактировано: ЫукпШ -
              Цитата Lun2 @
              А каким образом программа может узнать запущена она под админом или нет ?

              ExpandedWrap disabled
                IsUserAnAdmin
                Цитата ЫукпШ @
                IsUserAnAdmin

                С некоторыми оговорками ... https://stackoverflow.com/questions/2993964...-and-the-user-a
                  Цитата ЫукпШ @
                  Цитата Lun2 @ 28 ноября, 01:22
                  И каким образом она может перезапуститься уже под администратором ?

                  Наверное, так:
                  CollapsedWrap disabledLine numbers off

                  ::CreateProcessWithLogonW (...);


                  И не только под администратором, а вообще под любым юзером.
                  Надо указать юзера, пароль и командную строку.
                  Диалог ввода юзера и пароля надо самому смастерить (если нужно).


                  ЫукпШ, спасибо за ответ!

                  А если хочу, чтобы система сама выдавала запрос на ввод логина пароля - как это сделать.
                  Ведь когда в проводнике запускаю под админом, как я понял, выдается "системный" диалог для ввода юзера и пароля
                  - лично моей программе эти данные не нужны...
                    Цитата Majestio @
                    Чтобы UAC вообще показывал кнопку «Запуск от имени администратора», в exe должен быть встроен манифест с requireAdministrator или asInvoker. Самый простой способ — добавить в проект файл app.manifest с:


                    Majestio,Спасибо!
                    Про манифест знаю. Задача в том, что изначально программа запускается без прав админа, а для определенных задача они становятся необходимыми.

                    Так что изначально использовать манифест - это не, там сразу под админом пойдем...
                      Цитата Lun2 @
                      А если хочу, чтобы система сама выдавала запрос на ввод логина пароля - как это сделать.

                      Как то раз я тоже искал, как это сделать. И не нашёл.
                      Поэтому этот не сложный диалог делал сам.
                      Вот пример подобного

                      Однако, вроде бы такая winapi функция имеется, но я так не делал.
                      вот она
                      Сообщение отредактировано: ЫукпШ -
                        Цитата ЫукпШ @
                        Как то раз я тоже искал, как это сделать. И не нашёл.
                        Поэтому этот не сложный диалог делал сам.
                        Вот пример подобного

                        Однако, вроде бы такая winapi функция имеется, но я так не делал.
                        вот она


                        Спасибо!
                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0705 ]   [ 15 queries used ]   [ Generated: 14.12.25, 04:59 GMT ]