cygwin mintty / bashが管理者として実行されているかどうかを確認する方法は?


15

問題文: Cygwin mintty bashセッションが「管理者として実行」されているかどうかをテストする最もエレガントで堅牢な方法は何ですか?

なぜ具体的に?私は通常、minttyWindowsを使用するときにいくつかのターミナルを開いています(minttyタブはありません)。最も厄介なのは、たとえば、実行したいときpingや他の1回限りの手順で「管理者として実行」を右クリックして開始したターミナルウィンドウを見つける必要があるときです。ターミナルセッションの "管理者として実行"の状態を視覚的に示したい(起動ファイルのbashシェルプロンプト変数を変更することにより)。PS1~/.bashrc

いくつかの迅速な潜在的ソリューション:

  1. いくつかの環境変数の値を比較できます。env出力をすばやく見ると、非常に多くの違いがあります。ただし、別のWindowsマシン(おそらく異なるバージョンのWindowsを実行している)への移植性の観点から、どちらが最も信頼できるかを判断するのは困難です。
  2. idid -Gn管理者として実行した場合、より具体的には異なるグループが表示されます。私のWindows 7マシンでは私が持っているAdministratorsrootグループをリストに追加します。繰り返しますが、これが移植可能かどうかはわかりません。
  3. 通常のユーザーとしては失敗する場所にファイルを書き込もうとすることができました。しかし、私は奇妙な場所にファイルを書きたくはありません-これはいくつかの想像されるシナリオでは潜在的に破壊的である可能性があります(たとえば、記憶媒体の故障)。
  4. コマンドが「管理者として」実行された場合に、戻りステータスまたは出力で示すWindowsプログラムを実行します。UNIX id(1)コマンドと似た目的を持つ(ただし、WindowsまたはCygwinにネイティブに存在するが、Windowsシステムの概念からPOSIXのエミュレートされた概念への変換があまり得られない)のが最善です。

より良いまたはよりエレガントな提案はありますか?おそらく、cygwinはこの目的専用のコマンドユーティリティを提供していますか?

更新:https : //stackoverflow.com/questions/4051883/batch-script-how-to-check-for-admin-rights/の97%の複製- bash(IMHO奇妙で古風な)Windowsの代わりにここに違いがありますcmd.exe。そこで回答と解説を確認してください。


これを行わない限り、「管理者として実行」を使用すると、管理者アカウントがプロセスを開始しても、プロセスは管理者権限に昇格されません。 これが常に行われるように、ショートカットを作成するだけです。
ラムハウンド

1
ConEmuを試すことをお勧めします。タブがあり、タブバーの異なるアイコンで示される管理者としてタブを実行できます。最も重要なのは、バックグラウンドでコンソールを使用することです。そのため、ネイティブWindowsアプリケーションは、minttyとは異なり正しく動作します。
ジャン・ヒューデック

2
@Ramhoundこの質問にすでに絞り込んでいた私の元の問題(管理者端末ウィンドウを区別する)は、そのためのショートカットを作成することで解決できますmintty。1。管理者として実行します。設定および3.代替アイコンを使用します。これを作成する方法を一般大衆に説明する場合、私はあなたに賛成票を差し上げます(あなたの答えで、スクリプト内でそれを行うことはできないと言わない限り:-)。
FooF

1
@FooF-管理者レベルのユーザーでプロセスを実行したからといって、プロセス自体がエスカレーションされたという意味ではありません。Windowsはデフォルトで、ユーザーがそのようなアクションを承認した場合にのみプロセスを削除します。したがって、Windowsの「管理者として実行」機能です。必要に応じて、Fooユーザーグループを含む任意のグループにすべてのアクセス許可を提供することもできます。
ラムハウンド

1
@FooF- sudorootユーザーとして実行している場合でも、それが必要であると考えてください。
ラムハウンド

回答:


9

同じ理由でこの関数を書きました。どのシェルが管理者特権を持っているのか、私にはわかりません。

function isadmin()
{
    net session > /dev/null 2>&1
    if [ $? -eq 0 ]; then echo "admin"
    else echo "user"; fi
}

この答え/programming//a/11995662/307968からWindows cmdシェルに適応しました。管理者である場合、ネットセッションは0ステータスを返します。

プロンプトを変更するか、タイトルバーの色を変更するだけです。


素敵な発見。stackoverflowコメントをチェックすると、これも失敗するエッジケースがあるようです。
FooF

それにもかかわらず、私はこの答えを受け入れました。なぜなら、それは非常に包括的な議論を指しているからです(stackoverflowの質問とそこに受け入れられた答えは現在それぞれ147と255のスコアを持っています)。
FooF

ありがとう!これを使用して、プロンプトでユーザー名を選択的に色付けします。売りが高ければ、私はそれを赤、そうでなければ緑に色付けします。多くのターミナルウィンドウを開いている場合、どのシェルが昇格しているかを追跡するのに役立ちます。
HelloGoodbye

16

この質問への決定的な答えはCygwinメーリングリストから来ます。プロセスを開始したユーザーがグループ544(管理者)の一部である場合、プロセスは管理者権限で実行されています。また、Cromaxによる以下のコメントから、グループ114(ローカルアカウントおよび管理者グループのメンバー)も時々存在するようです。これら2つのグループのテストは

id -G | grep -qE '\<(114|544)\>'

例えば、

id -G | grep -qE '\<(114|544)\>' && echo admin || echo user

過去には、/ etc / groupのルートグループであるグループ0を確認する必要もありました。ただし、/ etc / groupはCygwinにインストールされなくなったため、通常は存在する場合は削除する必要があるため、グループ0も確認することはお勧めません。グループ544のみ。


1
Cygwinメーリングリストでお問い合わせいただきありがとうございます。:-)(エミュレート/変換された)グループIDはシステム間で一定のままであることを知ってうれしいです。
FooF

確かに...私は自分自身を知りたかった、そしてそこの人々は知っている
アンドリューシュルマン

1
残念ながら、これはMingw / Msysでは機能しません。スティーブンの答えは、Windows 7でのみですが。
sparrowt16年

1
私はちょうどそれを(W7で)試しましたが機能しませんでしたが、Windowsのユーザーが管理者でもあるとしてログインしている場合、Cygwinが管理者として実行されたときに別のグループがあることに気付きましたidの出力、つまり114(ローカルアカウントおよび管理者グループのメンバー)にポップします。したがって、正規表現は次のように更新する必要がありますid -G | grep -qE '\<(114|544)\>' && echo admin || echo user
。–クロマックス

ありがとう。私はそれを見たことはありませんが、グループ114は管理者グループであるように見えるので、それも確認するのが妥当と思われます。答えを修正しました。
アンドリューシュルマン

7

Windowsプログラムの戻り値を使用しますat。PROMPTING特殊文字の機能も再現しました\$

# Set a white $ initially
eStyle='\[\e[0m\]$'

# If 'at' succeeds, use a red # instead
at &> /dev/null && eStyle='\[\e[0;31m\]#\[\e[0m\]'  # Use # in red

PS1='\n\[\e[0;32m\]\u@\h \[\e[0;33m\]\w\[\e[0m\]\n'"$eStyle "

例


idWindowsにはUNIX コマンドに相当するものがないと仮定して、これを正しい答えとして受け入れます。少なくともat引数なしでコマンドを実行しても、副作用はないようです。これから.bashrcファイルでこのメソッドを使用します!ハックをありがとう。
FooF 14

1
windows8.1上で動作するようには思えない
zzapper

1
@zzapperより具体的にしてください。何が起こる/起こらないのか?エラーメッセージ?
スティーブン14年

4
idが代わりに推奨されていません使用schtasks.exeで、同じ値を返しますが、この作品の管理者かどうか
zzapper

2

id -G | grep -qE '\<(544|0)\>'私の出力は、昇格しても<>も544でもなかったので、私には役に立たなかったようです。ただし、への書き込みには昇格が必要なので%WINDIR%\system32、シェル関数を使用して昇格をテストするためにそれを使用しました。

is_elevated() { 
   [[ $(uname -o) -eq "Cygwin" ]] || return 1
   touch $WINDIR/system32/.cyg_elevated &> /dev/null
}

スティーブンの赤いハッシュ文字の優れたアイデアに適用すると:

is_elevated && PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\[\e[0;31m\]#\[\e[0m\] '

1

管理者だけができることをして、成功または失敗をテストします:-

if touch c:/Users/.x ; then  echo 'ok'  ; fi

または

touch c:/Users/.x && echo ok

または

touch c:/Users/.x && \rm c:/Users/.x && echo ok

または

touch c:/Users/.x  &> /dev/null && \rm c:/Users/.x && echo you are admin

1

Windows上のMsysでこれを試してください(受け入れられた答えがMsysで機能しなかったことがわかりました)

at &> /dev/null && echo "Running as admin" || echo "NOT running as admin"

これはat、管理者として実行している場合にのみゼロであるというリターンコードに依存しています。


1
これは、@ Stevenが以前の回答で与えたのと同じ方法のようです(コメントによると、Windows 8.1では動作しないようです-MSYSの "at"が何らかの形である場合を除く)。質問はCygwinについてでしたが、同様のMSYSと比較するのは興味深いです。貢献してくれてありがとう。
FooF

はい、非常に似ています。しかし、bashプロンプトスタイルを設定するのではなく、スクリプト(Win7、Msys)をチェックインするためにこの質問を使用しようとしたため、これは同じことを行う他の誰かに役立つ可能性があると思いました
sparrowt

有用性に同意します。
FooF
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.