13

ユーザーがWindowsXPで管理者権限を使用して実行されているかどうかを検出する方法を見つけようとしています。これは、 whoamiコマンドのおかげで、Vista/Win7ではかなり簡単に実行できます。これは、Vistaでそれを行う方法のRubyのスニペットです。

次のリンクには、muteWによって提案されたソリューションが組み込まれていることに注意してください

http://gist.github.com/65931

問題は、whoamiにはWindows XPが付属していないため、管理者として実行している場合でも、上記のリンクされたメソッドはWinXPでは常にfalseを返します。

では、Ruby、コマンドラインツール、バッチファイル、さらにはサードパーティ(実際にはオープンソースである必要があります)ツールを使用して、Windows XPで管理者として実行されているかどうかを検出する方法を知っている人はいますか?

4

6 に答える 6

32

これにより、ユーザーが昇格モードで実行されているかどうかが検出されます (たとえば、"Run As" Administrator であったコマンド プロンプト)。これは、LOCAL SERVICE アカウントのレジストリ キーを読み取るために管理者権限が必要であるという事実に依存しています。

reg query "HKU\S-1-5-19"

これは、読み取れない場合はゼロ以外のエラー コードを返し、読み取れる場合はゼロを返します。
XPから動作...

于 2011-07-14T10:21:30.857 に答える
11

あなたが実行する場合

>net localgroup administrators 

コマンド シェルでは、Windows XP の管理者アカウントのリストを取得する必要があります。出力を解析してスキャンするだけで、必要な特定のユーザー アカウントを確認できます。たとえば、現在のユーザーが管理者であるかどうかを確認するには、次のことができます-

>net localgroup administrators | find "%USERNAME%"
于 2009-02-18T09:46:24.560 に答える
7

Piskvor オプションは問題ありません。または、この URL http://weseetips.com/2008/04/16/how-to-check-whether-current-user-have-administrator-privilege/を確認してください。

これはそのページのコードです

SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
// Initialize SID.
if( !AllocateAndInitializeSid( &NtAuthority,
                               2,
                               SECURITY_BUILTIN_DOMAIN_RID,
                               DOMAIN_ALIAS_RID_ADMINS,
                               0, 0, 0, 0, 0, 0,
                               &AdministratorsGroup))
{
    // Initializing SID Failed.
    return false;
}
// Check whether the token is present in admin group.
BOOL IsInAdminGroup = FALSE;
if( !CheckTokenMembership( NULL,
                           AdministratorsGroup,
                           &IsInAdminGroup ))
{
    // Error occurred.
    IsInAdminGroup = FALSE;
}
// Free SID and return.
FreeSid(AdministratorsGroup);
return IsInAdminGroup;
于 2009-02-18T13:13:22.690 に答える
2

CheckTokenMembershipメソッドを確認してください。IsUserAdmin()実装のサンプルに加えて、その関数が期待されるものを返さない場合と、それを改善するために何をすべきかについてのその他の有用なコミュニティフィードバックがあります。

于 2009-02-18T09:32:58.400 に答える
1

これがより良い(PowerShell)方法です:https://stackoverflow.com/a/16617861/863980

1行で、次のように言うことができます(poshでコピー/貼り付けすると機能します):

(@(([ADSI]"WinNT://./Administrators,group").psbase.Invoke("Members")) | `
foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}) -contains "Administrator"

=>Trueユーザーが管理者グループに属している場合に返されます (ユーザーが管理者であることを確認するのではなく)

(注: バッククォートまたはグレイブ アクセント ` は、PowerShell ではキャリッジ リターンをエスケープします。Ruby では、C++ の system('command') などのシェル コマンドを実行します。)

したがって、Ruby では、次のように言うことができます (irb でコピー/貼り付け):

def is_current_user_local_admin?
  return `powershell "(@(([ADSI]'WinNT://./Administrators,group').psbase.Invoke('Members')) | foreach {$_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null)}) -contains 'Administrator'"`.include? "True"
end

ただし、WMIの(さらに優れた)方法はわかりません。これで、(Ruby で) 次のようなことができたはずです。

require 'win32ole'
wmi = WIN32OLE.connect('WinNT://./Administrators,group')
# don't know what should come here...
于 2014-10-11T19:44:48.760 に答える