管理者権限について

[戻る]
なおぞう 2016/02/18(木) 11:13:00
お世話になります。よろしくお願いします。
VS2013 スタティックライブラリでMFC使用、Unicode文字セット、共通言語ランタイムサ
ポートしない。の環境で開発しております。

管理者だったら処理をしたい。ということで、管理者であるかの確認を、
AllocateAndInitializeSid() と、checkTokenMemberShip()を使って行うコードを用意
しました。

    ULONG    ulReturn = ERROR_SUCCESS;
    BOOL    bResult = TRUE;

    SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
    PSID AdministratorsGroup;

       // セキュリティID(SID)を取得する
    bResult = AllocateAndInitializeSid(&NtAuthority,
        2,
        SECURITY_BUILTIN_DOMAIN_RID,
        DOMAIN_ALIAS_RID_ADMINS,
        0, 0, 0, 0, 0, 0,
        &AdministratorsGroup);

    // アクセストークン内でのSIDの有効性を調べる
    CheckTokenMembership(NULL, AdministratorsGroup, &bResult);
    FreeSid(AdministratorsGroup);//SID解放
    
    return bResult;

管理者権限を持つユーザで実行しているのですが、&bResultに0(SID無効)が入ってしま
います。どうしてなのか分からなくて困っています。

もしかして、Administratorというユーザアカウントでログインしていないと駄目なので
しょうか。

コードに間違いがあるなど、解決方法がありましたら教えていただけますようお願い致し
ます。

aetos 2016/02/18(木) 11:40:05
BUILTIN\Administrators の SID が欲しいなら CreateWellKnownSid 関数でいいんじゃな
いでしょうか。
WellKnownSidType は WinBuiltinAdministratorsSid (26) で。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa446585.aspx

なおぞう 2016/02/18(木) 13:27:02
>aetos様

 CreateWellKnownSid()関数を教えていただきありがとうございます。
AllocateAndInitializeSid()より新しい関数のようですね…。

今回は、SIDをとるところは問題なくて、そのSIDの有効性を確認するところで躓いています。
管理者権限を持つユーザの状態でプログラムを動かしているのに、CheckTokenMembership
で、無効が返ってきてしまうのです。

管理者権限「有効」という結果が欲しいのですが、それが取れない原因が分からなくて質
問させていただいています。
よろしくお願いします。

aetos 2016/02/18(木) 13:36:26
掲示されたコードをそのままコピペで実行してみましたが、正常に判定できているようで
す。
見た感じ問題なさそうですし。

昇格実行(管理者として実行)していますか?

aetos 2016/02/18(木) 13:37:40
SHTestTokenMembership という関数もありました。
https://msdn.microsoft.com/en-us/library/windows/desktop/bb762256.aspx

より用途が限定された関数ですが、SID の作成・解放が必要ないので楽ちんです。

なおぞう 2016/02/18(木) 13:55:00
[[解決]]
>aetos様

今、こちらでもその(管理者権限で実行)事に気が付き、
DOSプロンプトを管理者権限で立ち上げて動作させることができました。

VS2013自体も「管理者権限で立ち上げ」があるんですね…気がつかなかったです。
これを使えばデバッグモードで動作確認もできますね。

SHTestTokenMembership につきましても情報ありがとうございます。

古いスレッドには追加発言できません。