ユーザー入力を受け取り、システム全体に変更を加えるスクリプトを作成したいと考えています。これは非常に汎用的である必要がありますが、単に「管理者として」実行されているかどうかを確認するために一番上に置く必要があります。そうでない場合は、それを伝えるメッセージを表示します。もしそうなら、私はそれを続けてほしい。これを常に確認する方法はありますか?管理者として新しいセッションを開始するつもりはありません。現在管理者として実行されているかどうかを検出したいだけです。
ユーザー入力を受け取り、システム全体に変更を加えるスクリプトを作成したいと考えています。これは非常に汎用的である必要がありますが、単に「管理者として」実行されているかどうかを確認するために一番上に置く必要があります。そうでない場合は、それを伝えるメッセージを表示します。もしそうなら、私はそれを続けてほしい。これを常に確認する方法はありますか?管理者として新しいセッションを開始するつもりはありません。現在管理者として実行されているかどうかを検出したいだけです。
回答:
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
net session >nul 2>&1 && echo Success || echo Failure
。このコンパクトな構文の方が便利だと思います。
これにより、高い整合性レベルがチェックされます。(Windows Vista以降で動作します)
@echo off
whoami /groups | find "S-1-16-12288" > nul
if %errorlevel% == 0 (
echo Welcome, Admin
) else (
echo Get lost, User
)
whoami
はXPにありません。
、これとSEにまたがる複数の他の質問に多くの答え(多くは1、2、3は、この何らかの形で欠損しているすべては、数名に)明確に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 つはさらに古いです。
私が見つけた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にまで遡ります。通常のユーザープロセスまたは昇格されていないプロセスは、管理者または昇格されたプロセスが成功するディレクトリプローブに失敗します。
場合は、このテストは失敗しEveryone
、BUILTIN\Users
または他の同様のグループがsystemprofileへの読み取り権限を与えられています。確かに、これは「NT AUTHORITY \ Authenticated Users」にsystemprofileの読み取り/実行権限を与えるWindowsドメインコントローラーとして構成されたマシン以外の非標準構成です。
verify
。私は、cd .
エラーレベルを0に設定し、出力を生成しない(cdスペースドット)を使用する傾向がありますcd . >somefile
。つまり、Windows 2000、XP、Vista、2003、2008、2012、7、8、および10で「dir」をテストしました。これらの「dir」はすべて、成功する前にerrorlevelを0にクリアします。 「dir」。したがって、ウィリアムが最初にエラーレベルをクリアするために「検証」を使用した理由はわかりません。