it-swarm-ja.com

異なるWindows資格情報を使用する複数のSublimeインスタンス?

セキュリティを重視する専門家として、私は自分のコンピューターで非特権アカウントとして日常業務を行っています。特権ドメイン管理者アカウントを使用して、個々のプログラムやシェルなどを起動します。

私はほとんどの場合、12個のファイルを開いた状態で、特権のないアカウントで崇高なエディターを開いています。ときどき、昇格された権限で新しい崇高なウィンドウを開きたいことがあります([スタート]-> [崇高]を右クリック-> [別のユーザーとして実行])。残念ながら、これは新しい崇高なインスタンスを開始するのではなく、既存の非特権インスタンスをフラッシュするだけです。

[ファイル]-> [新しいウィンドウ]またはショートカットを使用して新しいインスタンスを開く方法について、Googleには何十ものヒットがありますが、これはまったく役に立ちません。そのメソッドは、異なる特権のセットで実行されるウィンドウを作成しないためです。

では、別のアカウントの権限で実行されているSublimeの2番目のインスタンスを開始するにはどうすればよいですか?

私のシステムは現在Windows8.1を実行しており、崇高なビルド3083を使用していますが、これはそれほど重要ではないと思います。

4
Zoredache

技術的には、このような効果を実現する方法は、名前付きパイプなどのグローバルにアクセス可能な同期オブジェクトを開くことです。 2番目のプロセスは既存のオブジェクトを検出し、何らかの方法で最初のプロセスにファイルを開くように指示します。

そして、それはまさにSublimeTextが行っていることでもあります。これは Process Explorer(SysInternals) で観察できます。

  1. 管理者としてProcessExplorerを実行します
  2. Sublimetextを実行する
  3. プロセスリストでSublimetextを選択します
  4. 押す Ctrl+H ハンドルの下のペインを表示するには
  5. 名前に「SublimeText2」が含まれるMutantタイプのハンドルを見つけます。 \Sessions\1\BaseNamedObjects\4d3560c7bb75b0aede072672a3c001bb-Sublime Text 2のように見えるかもしれません
  6. ミュータントを右クリック
  7. 「ハンドルを閉じる」を選択します
  8. SublimeTextの別のインスタンスを開始します

これで、SublimeTextの新しいインスタンスを開始する方法がわかりました。もちろん、このプロセスを自動化する必要があります。これで、必要なシーケンスフローがわかりました。

  1. sublim_text.exeのすべてのプロセスを検索します。例:使用 EnumProcesses(MSDN)
  2. ハンドルのリストを確認します。例:使用 NtQuerySystemInformation with SystemHandleInformation
  3. 名前に「SublimeTest2」が含まれるすべてのミュータントを閉じます。例: CloseHandle(MSDN) を使用します。

新しいプロセスによってハンドルが再度作成されるため、新しいプロセスのハンドルも閉じる必要があります。

Handle(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
4
Thomas Weller

Windows+R)とこのコマンドを実行してみてください

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

私はWindowsを使用していませんが、動作するはずです。

更新

OPの最も信頼のおける解決策は、同じディレクトリにsublime_text.exeのコピーを作成し、それを特権で実行することでした。

その他の提案された未テストのソリューション

4
Joaquín O

Windowsには、Sublime Textが実行していることを直接実行する方法はありません。つまり、この動作をオーバーライドする普遍的な方法はありません。プログラム自体がこの動作をどのように実装するかによって異なります。残念ながら、2番目のセッションが管理者セッションであるという事実により、特権レベル間の通信をブロックする手法を使用することが難しくなります。これは、特権の高いアプリが特権の低いアプリと通信する必要があり、ほとんどの場合許可されているためです。

まず、セッションのマージを自動的にオフにすることができます。これの欠点は、現在のウィンドウで開きたいファイルが新しいウィンドウで開くことです。したがって、これは明らかに劣ったオプションですが、存在します。

Sublimeが単に名前でそれ自体の別のインスタンスを探す場合は、実行可能ファイルのコピーを2つ作成し、一方の名前に「Admin」を追加し、「互換性」タブを使用して、そのインスタンスを常に管理者として実行する必要があるものとしてマークします。スタートバーまたはタスクバーに追加すると、管理者専用のエディターを簡単に起動できます。ただし、最初の更新時には更新されないことに注意してください。シンボリックリンクまたはハードリンクの使用は、Sublimeがコマンドラインをチェックしている場合は機能しますが、イメージ名をチェックしている場合は機能しません(イメージ名は常に最初の正規パスに解決されます)。

動作する可能性のある少し極端なアプローチは、ループバックリモートデスクトップを使用することです。これは、WindowsのサーバーSKUでのみ機能します。これは、2つの対話型セッションを同時にアクティブにする必要があるためです(Windowsのクライアントバージョンでは禁止されています)が、Sublimeは、通常はユーザー境界を無視する場合でも、セッション境界で停止する場合があります。ドメインadmincredsを使用してlocalhostにリモートでアクセスし、Sublimeを起動します(または、Sublimeを自動的に起動するように設定するか、一方のアプリをデスクトップに完全に描画するのではなく、デスクトップに転送するように設定します)。このアプローチは、(グローバルではなく)ユーザーセッションで作成される名前付きミューテックスなどに対して機能します。

Sublimeの非特権インスタンスが作成できる唯一の場所は、通常、特権バージョンがそれらを検索する場所ではないため、これはおそらくファイルまたはレジストリキーではありません。ただし、例外があります。たとえば、ProgramDataは誰でも書き込み可能です。それがSublimeがそれ自体の他のインスタンスを検出する方法である場合、別のエディターを使用する以外に実行可能な提案はありません。これは、マルチユーザーと互換性のない完全な動作です。

上記のアプローチが機能しない場合、唯一のオプション(常に管理者としてSublimeを起動するか、管理者の作業に別のエディターを使用する以外)は、開発者を突いて、マルチユーザーシナリオでより適切に動作するように依頼することです。ほとんどのWindowsプログラムは、複数のユーザーが一度にプログラムを実行したいという概念をよく認識していませんが、完全に互換性のないものもあります。 Sublimeの開発者は、たとえば、セッションをマージする前に、既存のインスタンスが実行されている資格情報を確認できます...しかし、開発者がそれ自体を考えていなかった場合は、バグを報告して修正する必要があります。 。

2
CBHacking

問題をよりよく理解したので、両方のシステムでファイルを開いた単一のエディターはありません。 1つのシステムで編集してから、sftpなどを使用してそれらの変更をリモートシステムに転送します。それを行うためのsublimeのプラグインを入手するか(リモートシステムにsftpサーバーがあると仮定)、ビルドシステムを使用してリモートシステムへのコピー機能を実行できます。

0
Todd

前述のとおり 、Exe of Sublimeへのパスを変えるだけで、実行中のインスタンスを再利用でき、ファイルをコピーする必要もありませんが、ハードリンクを使用してExeをリンクするか、 ジャンクション 同様に機能します。

それに加えて、GitHubに関する同様の議論では、コマンドライン引数--multiinstance言及されました そしてそれは本当にSublimeに現在実行中のすべてのセッションを無視して新しいセッションを開始させるようです。つまり、私が行っているのは、Sublimeへのパスを含む唯一のデフォルトのインストールディレクトリにシェルリンクを作成し、コマンドライン引数を追加して、adminとして開始できるようにすることです。プロセスモニターを見ると、実際には管理インスタンスが実行され、実行され続けています。これまでのところ、短所はありませんでした。

行って、それについて言及してくれたFichteFollに感謝します。

Settings for command line.Settings to execute as Administrator.

0