質問

私は、ユーザーがWindows XPで管理者権限で実行されているかどうかを検出する方法をうまくしようとしています。これは、ビスタ/ Win7の中の whoamiはのコマンドのおかげで行うことは非常に簡単です。ここではVistaでそれを行う方法については、Rubyで抜粋です。

の注意は、次のリンクは今muteWによって提案されたソリューションを組み込んだ

http://gist.github.com/65931する

トラブルは、Windows XPに付属していませんので、上記のリンク方法は、常に我々が管理者として実行している場合でも、WinXPの上でfalseを返しますwhoamiは、あるます。

だから、誰もが(実際には、オープンソースであることが必要である)我々はルビー、コマンドラインツール、バッチファイル、あるいはサードパーティ製を使用してWindows XPの下で管理者として実行しているかどうかを検出する方法を知っていませんツール?

役に立ちましたか?

解決

ユーザーが昇格モードで実行されている場合は、

このは検出されます(例:「ファイル名を指定して実行として」管理者だったコマンドプロンプト)。それはあなたがLOCAL SERVICEアカウントのREGキーを読み取るために管理者権限を必要とするという事実に依存しています:

reg query "HKU\S-1-5-19"
それができるならば、

これは読むことができない場合は、ゼロ以外のエラーコードを返し、ゼロになる。
アップXPから作品...

他のヒント

あなたが実行している場合は、

>net localgroup administrators 

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

>net localgroup administrators | find "%USERNAME%"

Piskvorオプションの罰金、またはこのURLをご確認ください のhttp://はweseetips。 COM / 2008/04/16 /どのようツーチェックするかどうか、現在のユーザー-持つ管理者特権/

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

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;

CheckTokenMembership の方法をチェックしてください。 IsUserAdmin()の実装に加えて、その関数は、それを改善するために何をすべきかと予想されており、どのような返さないときにいくつかの他の有用なコミュニティからのフィードバックの存在サンプルがあります。

これは砲撃せずに出ています:

require 'win32/registry'

is_admin = false
begin
  Win32::Registry::HKEY_USERS.open('S-1-5-19') {|reg| }
  is_admin = true
rescue
end

戦略はあまりオーバーヘッドで、ピーターのに似ています。

ここでそれを行うためのより良い(PowerShellの)方法は次のとおりです。 https://stackoverflow.com/a/16617861/863980

は1行では、あなたが(上流階級でのコピー/貼り付けをし、それが動作します)と言うことができます:

(@(([ADSI]"WinNT://./Administrators,group").psbase.Invoke("Members")) | `
foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}) -contains "Administrator"
ユーザがグループを管理者に属する場合、

=>

(ユーザーを確認するとは対照的に、管理者である)Trueを返します

(注:バッククォートまたは重大なアクセントが `それはC ++のシステム(「コマンド」)のようなシェルコマンドを実行Rubyで、PowerShellの改行をエスケープ..)

だから、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...
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top