ユーザーが LDAP ユーザーである Red Hat Enterprise 6 の現在のユーザー情報を取得する際に問題がありますか?
ユーザー名、ホーム ディレクトリ、およびその他の詳細を取得する必要があるコード (実際にはインストール ツールの一部) があります。ユーザー ID に基づいてこれを行うために、getpwuid() 呼び出しを使用しています。簡単な内訳:
uid_t uid = getuid();
printf("UID = %d\n", uid);
errno = 0;
struct passwd* udetails = getpwuid(uid);
if (udetails != NULL)
{
printf("User name = %s\n", udetails->pw_name);
}
else
{
printf("getpwuid returns NULL, errno=%d\n", errno);
}
これは、ユーザーがローカル ユーザー (そのシステムの /etc/passwd 内) である場合に問題なく機能します。
ユーザーが LDAP 認証済みユーザーの場合、getuid を呼び出すとユーザー ID または現在のユーザーが返されますが、getpwuid を呼び出すと 0 が返され、エラー コードは errno に設定されません。ドキュメントによると、これはユーザーが存在しないことを意味します。
これは機能するはずですか?getpwuid マンページによると:
getpwnam() 関数は、ユーザー名に一致するパスワード データベース (ローカル パスワード ファイル /etc/passwd、NIS、および LDAP など) 内のレコードの分割フィールドを含む構造体へのポインタを返します。
getpwuid() 関数は、ユーザー ID uid に一致するパスワード データベース内のレコードの分割されたフィールドを含む構造体へのポインターを返します。
現在のユーザーが LDAP によって認証された場合、詳細を取得するために別の呼び出しが必要ですか? アプリケーションで LDAP データベースを開く必要がありますか、それともシステム コールで処理する必要がありますか?
追加: 同じ LDAP ディレクトリに対して認証する RHEL 5 ボックスでもこれを試しました。これは RHEL 6 ボックスの構成の問題でしょうか? それともより広い RHEL 6 の問題ですか?
追加: Basile Starynkevitch の要求による /etc/nsswitch.conf (コメント行は削除されています):
passwd: files sss
shadow: files sss
group: files sss
hosts: files dns
bootparams: nisplus [NOTFOUND=return] files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: files
services: files sss
netgroup: files sss
publickey: nisplus
automount: files ldap
aliases: files nisplus
これらのいくつかは、ある時点でldapに言及する必要があると思いますか? 実際、これはLDAPをまったく使用していないことを示唆しています....