現在のコマンドプロンプトが管理者として起動されたかどうかを確認します


21

ユーザー入力を受け取り、システム全体に変更を加えるスクリプトを作成したいと考えています。これは非常に汎用的である必要がありますが、単に「管理者として」実行されているかどうかを確認するために一番上に置く必要があります。そうでない場合は、それを伝えるメッセージを表示します。もしそうなら、私はそれを続けてほしい。これを常に確認する方法はありますか?管理者として新しいセッションを開始するつもりはありません。現在管理者として実行されているかどうかを検出したいだけです。



@ g-manどのように関連していますか?
カナダのルークレインステートモニカ

また、管理者として実行するかどうかに応じて異なる動作をするコマンドを要求しています。または、少なくともそれらを応答として取得しています。
G-Manが「Reinstate Monica」と言う

回答:


16

Stack Overflowでこれを見つけました:

@echo off
goto check_Permissions

:check_Permissions
echo Administrative permissions required. Detecting permissions...

net session >nul 2>&1
if %errorLevel% == 0 (
    echo Success: Administrative permissions confirmed.
) else (
    echo Failure: Current permissions inadequate.
)

pause >nul

削除された理由は何ですか?
カナダのルークレインステートモニカ

この作品は、管理者アカウントの両方から、私は限られたユーザーとして実行されますが、「管理者として実行」を選択
カナダのルークREINSTATE MONICA

2
同じ考えですが、条件付き実行演算子を使用しますnet session >nul 2>&1 && echo Success || echo Failure。このコンパクトな構文の方が便利だと思います。
dbenham

6
これには、「サーバー」サービスが実行されている必要があります。
ivan_pozdeev 16

8

これにより、高い整合性レベルがチェックされます。(Windows Vista以降で動作します)

@echo off

whoami /groups | find "S-1-16-12288" > nul

if %errorlevel% == 0 (
 echo Welcome, Admin
) else (
 echo Get lost, User
)

1
whoamiはxpでサポートされていません私のawnserは、windows xpからwindows 8までのすべてのOSをよりよくサポートしています
アレックス

2
これは、コマンドプロンプトを開くだけで機能します。CMDを管理者として実行した場合、ユーザーとして実行されていることが引き続き表示されます
カナダのルークREINSTATE MONICA

2
より多くのOSに対する@Alexサポートは優れていますが、この方法は、信頼性の低いネガをなくしてポジティブを推測するのではなく、現在のセッションに与えられた権限を直接クエリするため、より信頼性が高くなります。
イスジ14

2
週、whoami / groupsには、間違った情報を取得するエッジケースがあります。stackoverflow.com/questions/4051883/を

1
@week whoamiはXPにありません。
ivan_pozdeev

4

、これとSEにまたがる複数の他の質問に多くの答え(多くは123は、この何らかの形で欠損しているすべては、数名に)明確にWindowsが内蔵されたユーティリティ信頼性を提供していないことを示しています。だから、それはあなた自身を展開する時間です。

それ以上の汚いハッキングなし:

次のプログラムをコンパイルします(指示が続きます)か、プリコンパイルされたコピーを取得します。これは一度だけ行う必要があり、その後、.exeどこにでもコピーできます(たとえば、Sysinternals Suiteと一緒に)。

コードは、UAC、ドメイン、推移的グループなどの有無にかかわらず、Win2k + 1で機能します。これは、アクセス許可をチェックするときにシステム自体と同じ方法を使用するためです。chkadmin「Admin」または「Non-admin」を出力し、終了コードをそれぞれ0または1に設定します。出力は/qスイッチで抑制できます。

chkadmin.c

#include <malloc.h>
#include <stdio.h>
#include <windows.h>
#pragma comment (lib,"Advapi32.lib")

int main(int argc, char** argv) {
    BOOL quiet = FALSE;
    DWORD cbSid = SECURITY_MAX_SID_SIZE;
    PSID pSid = _alloca(cbSid);
    BOOL isAdmin;

    if (argc > 1) {
        if (!strcmp(argv[1],"/q")) quiet=TRUE;
        else if (!strcmp(argv[1],"/?")) {fprintf(stderr,"Usage: %s [/q]\n",argv[0]);return 0;}
    }

    if (!CreateWellKnownSid(WinBuiltinAdministratorsSid,NULL,pSid,&cbSid)) {
        fprintf(stderr,"CreateWellKnownSid: error %d\n",GetLastError());exit(-1);}

    if (!CheckTokenMembership(NULL,pSid,&isAdmin)) {
        fprintf(stderr,"CheckTokenMembership: error %d\n",GetLastError());exit(-1);}

    if (!quiet) puts(isAdmin ? "Admin" : "Non-admin");
    return !isAdmin;
}

コンパイルするには、Windows SDKコマンドプロンプトで実行します。

cl /Ox chkadmin.c

(VS2012 +を使用している場合、2k / XPをターゲットにする必要がある場合はさらに調整が必要です


メソッドは/programming/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908の好意により提供されています

1 MSDNは、APIはXP +であると主張していますが、これは誤りです。CheckTokenMembership は2k +で、もう1 つはさらに古いです。


3

私が見つけたCMDスクリプトを使用して管理者権限をチェックする最もクリーンな方法は次のようなものです:

@echo off

REM  Calling verify with no args just checks the verify flag,
REM   we use this for its side effect of setting errorlevel to zero
verify >nul

REM  Attempt to read a particular system directory - the DIR
REM   command will fail with a nonzero errorlevel if the directory is
REM   unreadable by the current process.  The DACL on the
REM   c:\windows\system32\config\systemprofile directory, by default,
REM   only permits SYSTEM and Administrators.
dir %windir%\system32\config\systemprofile >nul 2>nul

REM  Use IF ERRORLEVEL or %errorlevel% to check the result
if not errorlevel 1 echo has Admin privs
if     errorlevel 1 echo has only User privs

この方法はCMD.exeビルトインのみを使用するため、非常に高速です。また、SIDやグループメンバーシップをチェックするのではなく、プロセスの実際の機能をチェックするため、有効なアクセス許可がテストされます。また、これはWindows 2003およびXPにまで遡ります。通常のユーザープロセスまたは昇格されていないプロセスは、管理者または昇格されたプロセスが成功するディレクトリプローブに失敗します。

場合は、このテストは失敗しEveryoneBUILTIN\Usersまたは他の同様のグループがsystemprofileへの読み取り権限を与えられています。確かに、これは「NT AUTHORITY \ Authenticated Users」にsystemprofileの読み取り/実行権限を与えるWindowsドメインコントローラーとして構成されたマシン以外の非標準構成です。


> verifyの検証がオフになっています。> verify /?ファイルがディスクに正しく書き込まれたことを確認するかどうかをcmd.exeに伝えます。確認[オン| OFF]現在のVERIFY設定を表示するには、パラメーターなしでVERIFYと入力します。このコマンドはスクリプトにどのように役立ちますか?
カナダのルークレインステートモニカ

3
@Canadian Luke、一部の組み込みコマンドコマンドは、エラーがなければerrorlevelをクリアしません。したがって、人々はなどのハックを使用してエラーレベルをクリアする習慣になりましたverify。私は、cd .エラーレベルを0に設定し、出力を生成しない(cdスペースドット)を使用する傾向がありますcd . >somefile。つまり、Windows 2000、XP、Vista、2003、2008、2012、7、8、および10で「dir」をテストしました。これらの「dir」はすべて、成功する前にerrorlevelを0にクリアします。 「dir」。したがって、ウィリアムが最初にエラーレベルをクリアするために「検証」を使用した理由はわかりません。
user3347790 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.