Super User v1.2.2 [2024/12/06] — запуск программ с повышением привилегий через UAC из командной строки под Windows

Если вы активный пользователь командной строки под Windows, вам определённо пригодится крохотная утилита SU (Super User), которая позволяет запускать программы с повышенными привилегиями без необходимости ввода пароля администратора (но с появлением диалога UAC). По сути, это аналог функции «Run as administrator» из контекстного меню, но с одним важным различием: стандартный механизм устанавливает рабочий каталог c:\windows\system32\, а SU сохраняет тот каталог, из которого он был запущен. То есть стандартными средствами нельзя запустить, например, сmd в том каталоге, который у вас сейчас открыт в Total Commander, что очень неудобно. А в SU этот вопрос полностью решён.

Скачать: sucmd.7z (18КБ). Исходный код →

Для работы необходимо предварительно запустить install.cmd, чтобы скопировать su32.exe и su64.exe под именем su.exe в системные директории c:\windows\syswow64\ и c:\windows\system32\ соответственно, после чего утилита всегда будет готова к работе в консоли или по нажатию Win+R.

Для того, чтобы запустить командную строку в текущем каталоге, например, при помощи Total Commander, необходимо просто ввести команду su в соответствующее поле внизу экрана, нажать Enter и согласиться с выдачей приложению повышенных привилегий (Alt+Y).

Для запуска любых сторонних команд с повышенными привилегиями необходимо указать их непосредственно после команды su. Например, если вы находитесь в каталоге c:\windows\system32\drivers\etc\ и хотите открыть файл hosts в блокноте, просто выполните команду: su notepad hosts.

Также не стоит забывать о быстром запуске командной строки при помощи диалога «Выполнить» (Win+R). При этом командный интерпретатор будет запущен в каталоге пользователя, а не в системном каталоге.

История изменений

v1.2.2 [2024/12/06]

  • Добавлен билд для ARM64 (su64a.exe).
  • Подписаны все исполняемые файлы, чтобы избежать предупреждений от Windows (добавляет 16КБ каждому exe).
  • Поднято ограничение на длину команды с 4096 символов до максимально возможного 32767.

v1.2.1 [2019/07/03]

  • Добавлен билд для x86-64 (su64.exe).

v1.2.0 [2013/02/19]

  • Первая публичная версия.
  1. #1
    «G~Lí†ch»

    О, размер даже меньше чем https://winreview.ru/obnovlenie-ele-1-0-1-utility-dlya-eskalacii-privilegij-otkrytogo-okna-komandoj-stroki/
    где было 8 кило. В нете можно найти похожее но размером больше 60 кило (если не под сотню). Осталось NTFS-сжатием до 4 кило сжать и норм.
    Но и тут эта же проблема. Например, хочу сделать симв. ссылку в системной папке: вхожу в командную строку, cd %windir%, набираю mklink su.exe затем перетягиваю в командную строку этот файл, жму enter – "Отказано в доступе", перетягиваю этот файл в командную строку, потом после него подписываю mklink su.exe и снова перетягиваю файл с программой, жму Enter — Не удаётся найти указанный файл!
    Ele.exe вообще молчит и симв. ссылку не создаёт. NircCmdC.exe elevatecmd хоть и запрашивает повышение, ссылка так и не создаётся. Короче, пришлось ещё дописывать cmd /k (что даже с nircmdc не прокатило).
    А вообще мечтаю чтоб в запущенное от админа окно cmd можно было Drag'n'Drop'ать (как в NTFS Strem Explorer — запускаешь – требует повышение, однако файлы в его окно спокойно перетягиваются).

  2. #2
    VEG Автор

    В случае с SU также не используется .NET Framework. Для такой задачи он не нужен.

    4 килобайта можно в принципе достаточно легко было добиться, если пообъединять секции и стрипнуть релоки, но такой исполняемый файл будет веять лёгкой нестандартностью, хоть и на работоспособности это никак не скажется.

    Не совсем понял вашу проблему — что именно вы пытались делать и каким образом.

  3. #3
    «G~Lí†ch»

    Короче, вместо того, чтобы объяснять, что хочу сделать я, объясню, что делает этот SU`к: вместо того, чтобы запустить комманду, ищёт ФАЙЛ! т.е. mklink.exe, del.exe — но таких файлов в системе не существует, поэтому и ругается: The system cannot find the file specified.
    А дописывать лишние буквы, чтоб ещё запускало командную строку "со следующей за ней командой", как-то лень.

  4. #4
    VEG Автор

    Команды в стиле del встроены в cmd, программ с таким именем нет в system32. Если вы попробуете нажать Win+R и запустить там del, то оно тоже будет ругаться, что не может найти такую команду. Хотя соглашусь, что кто-то мог бы пожелать выполнять такие команды через su. Вопрос только в том, что в Windows сегодня встроен ещё и Powershell, поэтому я не уверен, стоит ли перенаправлять все команды в cmd. На самом деле, одна из первых версий su делала свои дела через cmd, и там команды типа del должны работать. Увы, уже не помню почему я отказался от этого подхода. Но спасибо на указанную проблему. Поразмыслю над этим, может быть вернусь к использованию cmd в качестве исполнителя команд.

  5. #5
    VEG Автор

    Нашёл в своих заметках по SU. Я хотел предотвратить обработку всяких служебных символов промежуточным cmd, если пользователь пытается передать их в качестве параметра. Иначе в чём-то вроде

    su cmd /C copy /B /-Y su32.exe "%WINDIR%\system32\su.exe" ^&^& pause

    придётся всё экранировать дважды, чтобы оно сработало как ожидается. Тут конечно есть варианты, можно добавить какое-то автоэкранирование при передаче управления в промежуточный cmd... В общем есть над чем поразмыслить.

  6. #6
    «G~Lí†ch»

    А SU "случайно не запустит" скрывающегося в текущей (рабочей) папке cmd.bat (где задействуется %1 %2 и т.д.)?
    Уж для полной уверенности лучше %comspec%, ага, например, чтоб запустило какой-нибудь ConEmu вместо cmd…

    в Windows сегодня встроен ещё и Powershell

    Ой, ладно бы, если б последние его версии работали на домашних изданиях висты.
    И тогда при net HelpMsg 2 надо как-то выяснять, из-под какой оболочки SU запускали. О, вот чёрт, тысячу проклятий consent.exe:
    &Yes = ERRORLEVEL 0
    &No = ERRORLEVEL 1223
    Вот что этот посредник портит! Ваш SU повышает привелегии, и командная строка уже ждёт ответа от consent.exe, а не SU, а тот показывает эту ошибку уже в своём окне, вместо того, чтобы передать её обратно в командную строку! А elevate.exe (Kai Liu), 5120 байт (32-бит) и 6144 байт (64 бит) сразу уведомляет об отсутствии файла, не успев повысится, поэтому нужный ERRORLEVEL можно использовать для того, чтобы повторить то же, но уже в качестве команды! Ага! Угораздило же мне только сейчас америку открыть! Прога эта аж 2009-2011 гг.! Хорошо, что хоть ссылки на 7z-архивчик ещё действительные!
    Exe-шки, так же, как и SU, легко жмутся NTFS-ом до стандартного размера кластера (т.е. оба файла займут всего 8 кб, не считая readme и исходников, ага, ВинЭбилити со своими двухсоткилобайтниыми Elevate.exe и рядом не стояли!). В общем, нашлось наконец-то адекватное решение, правда, нужно ещё создать пакетный файл в какой-нибудь из %path% (например в %windir%\e.cmd):

    "E:\UsefulToolz\elevate (KaiLiu)\elevate.exe" %1 %2 %3 %4 %5 %6 %7 %8
    goto e%ERRORLEVEL%
    :e0
    exit
    :e1
    "E:\UsefulToolz\elevate (KaiLiu)\elevate.exe" /k %1 %2 %3 %4 %5 %6 %7 %8

    Да, топорный костыль – не умею я писать "красивые пакетные файлы"! Исправьте прямо в этом посте, вместе с этим комментом. Зато "отказанную в доступе" команду можно теперь выполнять "почти как su !!":
    ; Home; e; пробел.
    Я думаю, вам будет интересно поколупайть исходники этого elevate (они всё равно в комплекте).

  7. #7
    «G~Lí†ch»

    Вот блин! Мой же "топор" не то что RegSvr32, даже fsutil не рубит (последний, так и не создав, просто закрывает командную строку даже не отругнувшись)! Придётся постоянно использовать с ключом /k %1 %2 %3 %4…
    Т.е. пришлось набирать в командной строке e notepad (и после enter`а командная строка закрылась) чтоб потом в блокноте открыть %windir%\e.cmd и оставить в это файле только последнюю строку, а запущенный с повышенными привелегиями блокнот мог сохранить этот файл по Ctrl+S. И после этого, каждый раз придётся вручную закрывать окно привилегированной командной строки, заодно прочитав, успешно или нет. И уже, введя e notepad, создаётся ещё и пустое окно командной строки с заголовком notepad :D

    Насчёт "красивых пакетных файлов", хотелось бы сделать что-то наподобие их (подробнее тут…), но не требующих использование vbs-файлов, иначе говоря, использовать с такой "типа политикой" (не предусмотрено в gpedit.msc):

    [HKLM\SOFTWARE\Microsoft\Windows Script Host\Settings]
    "Enabled"="0"

Комментарии временно закрыты.