3

Как профессионал в области безопасности, я выполняю свою повседневную работу на своем компьютере как непривилегированная учетная запись. Я буду запускать отдельные программы, оболочки или так далее с моей привилегированной учетной записью администратора домена.

У меня почти всегда мой превосходный редактор открыт в моей непривилегированной учетной записи с дюжиной открытых файлов. Иногда я хочу открыть новое возвышенное окно с повышенными привилегиями (Пуск -> Щелкните правой кнопкой мыши по Sublime -> Запуск от имени другого пользователя). К сожалению, это не запускает новый возвышенный экземпляр, он просто мигает существующий непривилегированный экземпляр.

В Google есть десятки обращений о том, как вы можете использовать File-> New Window или ярлык для открытия нового экземпляра, но это мне совсем не помогает. Поскольку этот метод не создаст окно, работающее с другим набором привилегий.

Итак, как мне запустить второй экземпляр Sublime, работающий с привилегиями из другой учетной записи?

Моя система в настоящее время работает под управлением Windows 8.1, и я нахожусь на сборке 3083 возвышенного, но я подозреваю, что это не будет иметь большого значения.

4 ответа4

3

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

И это именно то, что делает Sublime Text. Вы можете наблюдать это с Process Explorer (SysInternals):

  1. Запустите Process Explorer от имени администратора
  2. Запустить Sublime text
  3. Выберите Sublime text в списке процессов
  4. Нажмите Ctrl+H, чтобы показать нижнюю панель для ручек
  5. Найдите маркер типа Mutant с "Sublime Text 2" в его названии. Это может выглядеть как \Sessions\1\BaseNamedObjects\4d3560c7bb75b0aede072672a3c001bb-Sublime Text 2
  6. Щелкните правой кнопкой мыши Мутант
  7. Выберите "Закрыть ручку"
  8. Запустить другой экземпляр Sublime Text

Теперь вы знаете, как запустить новый экземпляр Sublime Text. Конечно, вы хотите автоматизировать этот процесс. Необходимый поток последовательности теперь известен вам:

  1. Найти все процессы sublim_text.exe , например, используя EnumProcesses (MSDN)
  2. Просмотрите их список дескрипторов, например, используя NtQuerySystemInformation с SystemHandleInformation
  3. Закройте всех мутантов с "Sublime Test 2" в названии, например, используя CloseHandle (MSDN).

Вам также необходимо закрыть дескриптор для нового процесса, поскольку новый процесс создаст его снова.

Ручка (Sysinternals) полезна для настройки скрипта, который достигает того, что вам нужно. Он может найти ручку (строка 1) и закрыть ручку (строка 2)

Handle -p sublime_text.exe -a Sublime | find "Mutant"
Handle -c <handle> -p <pid> -y

В следующем полном сценарии измените имя пользователя. Скопируйте файл handles.exe в тот же каталог и запустите пакетный файл от имени администратора (так как файл handles.exe нуждается в правах администратора:

@echo off
REM Just in case this is run multiple times from a command line 
set pid=    
set handle=
REM Make the working directory the directory of the batch file
cd /d %~dp0 
REM Find PID and Handle
for /f "tokens=3,6" %%i in ('handle -p sublime_text.exe -a Sublime -accepteula ^| find "Mutant"') do set pid=%%i & set handle=%%j   
if "%pid%"=="" goto sublime 
REM Close the handle
handle -c %handle:~0,-1% -p %pid% -y > nul  
:sublime
runas /user:Username sublime_text.exe   
if errorlevel 1 pause
2

Попробуйте выполнить (Windows+R) и эту команду

runas /user:[the-other-user] C:\path\to\sublime_text

Я не на окнах, но это должно работать ..

Обновить

Оптимальным рабочим решением для OP было создание копии sublime_text.exe в том же каталоге и запуск его с привилегиями.

Другие предложенные непроверенные решения

2

Windows не предоставляет никакого способа напрямую делать то, что делает Sublime Text, что означает, что не существует универсального способа переопределить это поведение. Это будет зависеть от того, как сама программа реализует это поведение. К сожалению, тот факт, что второй сеанс является административным, усложняет использование методов, которые блокируют обмен данными между уровнями привилегий, потому что более привилегированное приложение должно общаться с менее привилегированными, и это почти всегда разрешено.

Прежде всего, вы, вероятно, можете отключить объединение сессий автоматически. Недостатком этого является то, что файлы, которые вы хотите открыть в текущем окне, будут открываться в новом. Так что это явно худший вариант, но он существует.

Если Sublime просто ищет другой экземпляр своего имени по имени, вы можете создать две копии исполняемого файла, добавить "Admin" к имени одного и использовать вкладку "Совместимость", чтобы отметить этот экземпляр как всегда необходимый для запуска от имени администратора. Добавьте его на панель "Пуск" или "Панель задач", и у вас будет легко запускаемый редактор только для администратора. Обратите внимание, что он не будет обновляться при первом. Использование символической ссылки или жесткой ссылки будет работать, если Sublime проверяет командную строку, но не проверяет имя изображения (имя изображения всегда соответствует первому каноническому пути).

Немного экстремальный подход, который может сработать, заключается в использовании удаленного рабочего стола с обратной связью. Это работает только в SKU серверов Windows, поскольку требует одновременной работы двух интерактивных сеансов (которые запрещены в клиентских версиях Windows), но Sublime может остановиться на границе сеанса, даже если он обычно игнорирует границу пользователя. Просто удаленно на localhost с правами администратора домена, а затем запустите Sublime (или даже настройте его так, чтобы он автоматически запускал Sublime, или, может быть, даже так, он просто перенаправляет одно приложение обратно на рабочий стол вместо полного рисования другого рабочего стола). Этот подход будет работать для таких вещей, как именованный мьютекс или аналогичный, который создается в сеансе пользователя (а не глобально).

Вероятно, это не файл или раздел реестра, поскольку единственные места, в которых может быть создан непривилегированный экземпляр Sublime, обычно находятся там, где их не ищет привилегированная версия. Есть исключения, хотя; например, ProgramData доступен для записи во всем мире. Если это то, как Sublime обнаруживает другой экземпляр самого себя, у меня нет подходящего предложения, кроме как использовать другой редактор; это просто не совсем совместимое с несколькими пользователями поведение.

Если описанные выше подходы не работают, ваш единственный вариант (если не всегда запускать Sublime от имени администратора или использовать другой редактор для работы с правами администратора) - это подтолкнуть разработчиков и попросить их вести себя лучше в многопользовательских сценариях. Большинство программ Windows в лучшем случае не знают, что несколько пользователей могут захотеть запустить программу одновременно, но некоторые из них полностью несовместимы с ней. Sublime devs могли бы, например, проверить учетные данные, под которыми уже существуют существующие экземпляры, перед слиянием сеансов ... но если разработчики сами не думали об этом, вам, возможно, придется подать ошибку, чтобы заставить их исправить ее. ,

1

Теперь, когда я лучше понимаю проблему, у меня не будет единого редактора с файлами, открытыми в обеих системах. Отредактируйте в одной системе, а затем перенесите эти изменения в удаленную систему с помощью чего-то вроде sftp. Вы можете получить плагин для возвышенного, чтобы сделать это (при условии, что у вас есть сервер sftp в удаленной системе) или использовать систему сборки для выполнения функции копирования в удаленную систему.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .