2

InstallShield基本MSIプロジェクト: ユーザー名が管理者グループに含まれているかどうかを確認するにはどうすればよいですか?

(そうすることが可能であると私が知っている現在のユーザーではありません。)

4

3 に答える 3

2

「net localgroup administrators」を実行して、出力を解析できます。もっと良い方法があると思いますが、そうでない場合は...

于 2009-04-10T20:14:09.357 に答える
0

私は2つのアプローチを考えることができますが、それぞれインストールスクリプトの上にコードを書く必要があり、Installshieldについてはもう詳しくありませんが、おそらくVisual Studioセットアッププロジェクトと同じように、カスタムアクションの概念があります。それがあなたに必要なことだと思います。

2番目は非常に複雑であるため(つまり、最初よりもさらに複雑です!)、最初の概要のみを説明します。明らかなアプローチはADです。次のコードスニペットは、ユーザー名とパスワードの組み合わせが存在するかどうかを示します。ユーザーを取得したら、ユーザーがどのグループに属しているかを把握できると確信しています。

if (true == String.IsNullOrEmpty(userName)) throw new Exception("userName not set");

DirectoryEntry entry = new DirectoryEntry();
entry.Username = userName;  // Use the fully qualified name here
entry.Password = password;

string DomainlessUsername = userName.Substring(userName.LastIndexOf('\\') + 1, userName.Length - userName.LastIndexOf('\\') - 1);

// We know straight away that if this is empty, we've drawn a blank!
if (true == String.IsNullOrEmpty(DomainlessUsername)) throw new Exception("userName not set");

DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(SAMAccountName=" + DomainlessUsername + ")";
search.PropertiesToLoad.Add("cn");

SearchResult result = search.FindOne();

if (null == result)
{
    throw new Exception("FindOne executed without exception, but result was null");
}
else
{
    // some logging here
}
return true;

ここで、このコードを実行するアカウントにADにアクセスする権限がない場合、潜在的な問題が発生します。上記のコードで十分に役立つことを願っているので、この投稿では詳しく説明しませんが、代替アプローチの基本原則は、LogonUserなどの関数にadvapi32.dllを直接シェルアウトすることです。(繰り返しになりますが、私の問題は管理者権限をチェックせずに資格情報を検証することでしたが、掘り下げる準備ができている場合はおそらくそこにリンクがあります)。

これのいくつかが役立つことを願っています!

于 2011-05-04T14:52:32.147 に答える
0

ユーザーは、ローカル サーバーの「管理者」グループに属することも、AD 内で定義された「ドメイン管理者」または「エンタープライズ管理者」グループの一部になることもできます。理想的な解決策は、ユーザー名パラメーターを受け取り、true または false を返す IsUserAdmin(user_name) というメソッドを使用して DLL を作成することです。

内部的に、このメソッドは IADsUser::Groups メソッドを呼び出して、指定されたユーザーが属するグループを特定し、列挙されたグループが上記の管理者グループのいずれかに属している場合は true を返します。そうでない場合は false を返します。この DLL は、InstallShield プロジェクト内で呼び出すことができます。ネストされたグループに注意してください。

于 2009-04-10T20:39:20.700 に答える