多个 Sublime 实例使用不同的 Windows 凭据?

多个 Sublime 实例使用不同的 Windows 凭据?

作为一名注重安全的专业人士,我每天都会以非特权帐户的身份在计算机上工作。我会使用我的特权域管理员帐户启动单个程序、shell 等。

我几乎总是在非特权帐户中打开 Sublime 编辑器,并打开十几个文件。有时我想以提升的权限打开一个新的 Sublime 窗口(开始 -> 右键单击​​ Sublime -> 以其他用户身份运行)。不幸的是,这不会启动新的 Sublime 实例,它只会闪现现有的非特权实例。

Google 上有几十条关于如何使用文件->新窗口或快捷方式打开新实例的搜索结果,但这对我毫无帮助。因为该方法不会创建在不同权限集下运行的窗口。

那么,如何使用另一个帐户的权限启动 Sublime 的第二个实例?

我的系统当前运行的是 Windows 8.1,并且我使用的是 Sublime 版本 3083,但我认为这不会有太大影响。

答案1

从技术上讲,实现这种效果的一种方法是打开一个全局可访问的同步对象,例如命名管道。第二个进程将检测现有对象,并以某种方式通知第一个进程打开该文件。

这正是 Sublime Text 所做的。你可以使用进程浏览器(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,例如使用枚举进程(MSDN)
  2. 浏览他们的句柄列表,例如使用查询系统信息SystemHandleInformation
  3. 关闭所有名称中带有“Sublime Test 2”的 Mutants,例如使用关闭句柄(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

我没有使用 Windows,但它应该可以工作。

更新

sublime_text.exe对 OP 的最终解决方案是在同一目录中复制一份,然后以特权运行它。

其他未经测试的解决方案

答案3

Windows 不提供任何直接执行 Sublime Text 所做操作的方法,这意味着没有通用的方法来覆盖此行为。这将取决于程序本身如何实现此行为。不幸的是,第二个会话是管理员会话,这使得使用阻止跨特权级别通信的技术变得更加困难,因为特权较高的应用程序需要与特权较低的应用程序进行通信,而这几乎总是被允许的。

首先,您可能可以关闭自动合并会话的功能。这样做的缺点是,您希望在当前窗口中打开的文件会在新窗口中打开。因此,这显然是一个较差的选择,但它确实存在。

如果 Sublime 只是按名称查找自身的另一个实例,您可以创建可执行文件的两个副本,在其中一个名称上附加“Admin”,然后使用“兼容性”选项卡将该副本标记为始终需要以管理员身份运行。将其添加到“开始”或“任务栏”,您就可以轻松启动一个仅管理员可用的编辑器。但请注意,当第一个更新时,它不会更新。如果 Sublime 正在检查命令行,则使用符号链接或硬链接会起作用,但如果它正在检查图像名称(图像名称始终解析为第一个规范路径),则不会起作用。

一种可能有效的稍微极端的方法是使用环回远程桌面。这仅适用于 Windows 的服务器 SKU,因为它需要同时激活两个交互式会话(Windows 的客户端版本禁止这样做),但 Sublime 可能会在会话边界处停止,即使它通常会忽略用户边界。只需使用域管理员凭据远程访问本地主机,然后启动 Sublime(或者甚至将其设置为自动启动 Sublime,或者甚至只是将一个应用程序转发回您的桌面而不是完全绘制另一个桌面)。这种方法适用于在用户会话中(而不是全局)创建的命名互斥锁或类似的东西。

它可能不是一个文件或注册表项,因为 Sublime 的非特权实例可以创建这些文件的唯一位置通常不是特权版本会查找它们的位置。但也有例外;例如,ProgramData 是全球可写的。如果这就是 Sublime 检测自身其他实例的方式,除了使用不同的编辑器之外,我没有其他可行的建议;这只是一种完全不兼容多用户的行为。

如果上述方法不起作用,您唯一的选择(除了始终以管理员身份启动 Sublime 或使用其他编辑器进行管理员工作)就是敦促开发人员,要求他们在多用户场景中表现得更好。大多数 Windows 程序充其量不知道多个用户可能想要同时运行程序的概念,但有些程序完全不兼容。例如,Sublime 开发人员可以在合并会话之前检查现有实例所运行的凭据……但如果开发人员自己没有想到这一点,您可能必须提交错误以让他们修复它。

答案4

现在我更好地理解了这个问题,我不会使用一个编辑器在两个系统上打开文件。在一个系统上编辑,然后使用类似 sftp 的工具将这些更改传输到远程系统。您可以获取 sublime 插件来执行此操作(假设您在远程系统上有一个 sftp 服务器)或使用构建系统执行到远程系统的复制功能。

相关内容