2017-03-28 10 views
1

私はperlで新しいです。私はWin32::IsAdminUser()関数を使用しています(実行可能にするためにコードを貼り付けることができないので、コード全体を貼り付ける必要があります)。これは、これが実行されると、ユーザが管理者グループのメンバーであるので、私は(C++)少しテスト関数を作成した理由をので、私は興味があった、0を返し、右ここでIsAdminUserを実行する前に、それを実行するコードです:Perl:IsAdminUserが間違った値を返す

int davai() 
{ 
FILE * fp; 

fp = fopen ("C:\\tmp\\davai.txt", "a"); 
fprintf(fp, "shevedi davai"); 
fflush(fp); 

HANDLE token = NULL; 
HANDLE dupToken = NULL; 

if(!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_DUPLICATE, &token)) 
{ 
    fprintf(fp, "davai: OpenProcessToken cheijva. %d\n", (int)GetLastError()); 
    fflush(fp); 
} 

if (DuplicateTokenEx(token, MAXIMUM_ALLOWED, NULL, SecurityDelegation, 
          TokenPrimary, &dupToken) == 0) 
{ 
    fprintf(fp, "davai: OpenProcessToken DuplicateTokenEx. %d\n", (int)GetLastError()); 
    fflush(fp); 
} 

PTOKEN_GROUPS pPrivilegesToken = NULL; 
DWORD cbSize = 0; 

GetTokenInformation(dupToken, TokenGroups, NULL, 0, &cbSize); 

pPrivilegesToken = (PTOKEN_GROUPS) LocalAlloc(LPTR, cbSize); 

if (GetTokenInformation(dupToken, TokenGroups, 
          pPrivilegesToken, cbSize, &cbSize) == FALSE) 
{ 
    fprintf(fp, "davai: GetTokenInformation cheijva. %d\n", (int)GetLastError()); 
    fflush(fp); 
} 

char * gio; 

for (ULONG i = 0; i < pPrivilegesToken->GroupCount; i++) 
{ 
    if (ConvertSidToStringSid(pPrivilegesToken->Groups[i].Sid, &gio) == 0) 
    { 
    fprintf(fp, "davai: ConvertSidToStringSid cheijva. %d\n", (int)GetLastError()); 
    fflush(fp); 
    } 

    fprintf(fp, "Value: %s\n",gio); 
    fflush(fp); 
} 

LocalFree (gio); 

return 1; 
} 

これだけのトークン、現在のプロセスを開き、ユーザーが関与しているすべてのグループが一覧表示されますここで私が手にouputを次のとおりです。

shevedi davaiValue: S-1-5-21-1018819917-2920201817-244685803-513 
Value: S-1-1-0 
Value: S-1-5-21-1018819917-2920201817-244685803-1000 
Value: S-1-5-32-544 
Value: S-1-5-32-545 
Value: S-1-5-4 
Value: S-1-2-1 
Value: S-1-5-11 
Value: S-1-5-15 
Value: S-1-5-5-0-179095 
Value: S-1-2-0 
Value: S-1-5-64-10 
Value: S-1-16-12288 

S-1-5-32-544Administrators基を表すために奇妙です。誰かが似たような問題を抱えているかどうかを調べるために検索しましたが、何も見つかりませんでした(私はWindows 7を実行しています)。多分あなたは私を助けることができます。どんな助けもありがとう。 Win32に記載したよう

+0

グループの属性を無視します。 'SE_GROUP_USE_FOR_DENY_ONLY'を確認しません – RbMm

+0

* Sid *しかし* SID_AND_ATTRIBUTESからの*属性だけでなく、このユーザーが* S-1-5-32-544 *本当に – RbMm

+0

を持っていないことを理解しているかもしれません。 – Rasty

答えて

3

本当に

Win32::IsAdminUser()は、内部的に、あなたは結果として内容isMemberSidToCheck == S-1-5-32-544CheckTokenMembership関数を呼び出して返します。しかし

SIDが存在し、TRUEを返し内容isMember SE_GROUP_ENABLED属性、 を持っている場合。それ以外の場合はFALSEを返します。

SIDがトークン内に存在する場合でも、システムは、アクセスチェックでSID を使用しなくてもよいです。 SIDが無効になっているか、 SE_GROUP_USE_FOR_DENY_ONLY属性を持つ可能性があります。

ユーザーがadminグループ(S-1-5-32-544)のメンバーであるが、(UAC下)昇格なしで実行本当に場合S-1-5-32-544されますトークンに存在するが、対照的に上昇AdminsのSE_GROUP_USE_FOR_DENY_ONLY属性のみ

SE_GROUP_ENABLED属性

でこれSIDを持っていると

だから、昇格された管理者ではないと思う。Win32::IsAdminUser()この場合、falseを返す必要があります

+0

あなたは私をもう一度保存する:)。私はチェックし、属性は 'SE_GROUP_USE_FOR_DENY_ONLY'です。 – Rasty

+0

ユーザー(このコードを実行している)がインタラクティブとしてログインしている場合は、15の値(10進数表記)とユーザーが問題のある以下の状況をバッチします。これは、対話型ログオンのユーザーがINTERACTIVEグループのメンバであるためですか? – Rasty

+0

@Rasty - 管理者のユーザーログをバッチとして使用する場合、対話型ログオン(* SE_GROUP_USE_FOR_DENY_ONLY *)とは対照的に* S-1-5-32-544 *と* SE_GROUP_ENABLED *(+複数のattr)があります。これはadmins sidに関連しています。 'INTERACTIVE'と' BATCH'の異なるグループ – RbMm

2

のWindows Vista上のプロセスが実際に昇格した権限で実行されている場合、それは唯一の非ゼロを返します。

「Vista」は「Vista以上」と認識します。 S-1-5-32-544は管理者 グループを表すために奇妙である

+0

はい、それは本当にそれを意味すると私はどのように証明できますか?すべてのウィンドウでそれをテストする以外に何か答えはありますか? – Rasty

+0

それはそれが意味するものです。 –

関連する問題