0

NSS 経由でリクエストを送信して、ユーザーの補助グループのリストを取得したいと考えています。私の推測では、次のプログラムですべてのグループを列挙できるはずです (そのため、メンバーを比較できます)。

#include <stdio.h>
#include <grp.h>
#include <stdlib.h>

struct group *groupStruct;

int main(){

        setgrent();

        while ( groupStruct=getgrent() )
           printf("%s\n", groupStruct->gr_name);

        endgrent();

        return 0;
}

idこの仮定は、実行されるソース コードのこの部分に基づいていますid -Gn(これが複製したい機能であるため)。それを見ると、別のファイルで定義されていることを介しgetugroups (0, NULL, username, gid)てグループのリストを取得しているように見えます (本質的に同じコードがここにあります)。上記と同じ setgrent()/getgrent() 手順を実行しているように見えるので、私の単純なプログラムはシステムのグループを列挙する必要があると感じています (代わりに、グループのみを実行しますが、このマシンには winbind があります)ユーザーがメンバーである winbind グループを取り込みます)。getugroups()/etc/groupid -Gn

4

1 に答える 1

1

後世のために:

コードが機能する理由はまだわかりませんが、私のものではありませんがid -Gn、何度も行ったり来たりした後、自分の問題を修正したと思います。基本的に、私は共有オブジェクトを構築し、initgroups/を使用getgroupsして実行中のプロセス (ヘルパー実行可能ファイル) のペルソナをターゲット ユーザーのデフォルトのペルソナ (ログイン後に取得するもの) に設定するヘルパー プログラムを使用して、現在のメンバーシップを列挙しています。ヘルパー プログラムの完全なコード:

#include <stdio.h>
#include <unistd.h>

struct group *groupStruct;

int main(int argc, char *argv[]){

        int numgroups, iter, retCode;
        int numgroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
        gid_t groupList[numgroups_max];

        if (argc != 2){
                printf("Insufficient Arguments.\n");
                return 1;
        }

        retCode=initgroups(argv[1], 0);

        if (retCode != 0){
                printf("Unspecified failure: %d\n\n", retCode);
                return 1;
        }

        numgroups = getgroups(numgroups_max, groupList);

        for (iter=0; iter <= numgroups; iter++){

                if (iter != 0 &&  iter != numgroups )
                        printf(" ");

                  // "zero" means both "nothing more" and could be the root user's primary group, allow the first one through
                if ( groupList[iter] == 0 && getuid() == 0 ){
                        if ( iter != 0 )
                                break;

                }else if ( groupList[iter] == 0 )
                        break;


                printf("%d", groupList[iter]);

        }

        return 0;
}

ユーザー名は、テスト目的でのみハードコードされています。コンパイルとテストの後、ユーザーのグループ ID が生成されます。ハードコードされた値を変更する (または argv にプッシュする) と、問題が解決します。実行中のプロセスのペルソナ (少なくともグループ メンバーシップ部分) を変更しているため、これをヘルパー実行可能ファイルにプッシュしました。

おそらく、パフォーマンス/セキュリティのためにライブラリの呼び出しルーチンに移動します (前にgetgroupsandを使用して補助グループとプライマリ グループを保存できますsetgroups)、別の実行可能ファイルで概念実証を行う方が迅速でした。

于 2013-05-24T19:13:30.730 に答える