2

InstallShield基本MSI项目中:如何检查用户名是否在管理员组中?

(不是我知道可以这样做的当前用户。)

4

3 回答 3

2

您可以运行“net localgroup administrators”并解析输出。我怀疑有更好的方法,但如果没有......

于 2009-04-10T20:14:09.357 回答
0

用户可以属于本地服务器上的“管理员”组,也可以是 AD 中定义的“域管理员”或“企业管理员”组的一部分。理想的解决方案是使用名为 IsUserAdmin(user_name) 的方法创建一个 DLL,该方法接受用户名参数并返回 true 或 false。

在内部,该方法将调用 IADsUser::Groups 方法来确定提供的用户所属的组,如果枚举的组属于上述管理员组之一,则返回 true。如果不是,它将返回 false。您可以在您的 InstallShield 项目中调用此 DLL。警惕嵌套组。

于 2009-04-10T20:39:20.700 回答
0

我可以想到两种方法,但是每种方法都涉及在安装脚本之上编写代码,我不再熟悉 Installshield,但大概就像 Visual Studio 安装项目一样,您有自定义操作的概念。我怀疑这就是你需要的。

我只会概述第一个,因为第二个非常复杂(即比第一个更复杂!)。显而易见的方法是 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 的权限,这里就有一个潜在的问题。我不会在这篇文章中详细介绍,因为希望上面的代码足以对您有所帮助,但替代方法的基本原理是直接将 advapi32.dll 封装到 LogonUser 之类的函数中。(请记住,我的问题是验证凭据而不是检查管理员权限,但如果您准备挖掘,那里可能有一个链接)。

希望有些帮助!

于 2011-05-04T14:52:32.147 回答