【问题标题】:Check whether the user name is in the administrator group检查用户名是否在管理员组中
【发布时间】:2009-04-10 19:41:21
【问题描述】:

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

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

【问题讨论】:

    标签: windows installation installshield admin


    【解决方案1】:

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

    【讨论】:

    • 感谢您的快速回复。虽然这样,如果一个组加入到admin组中,我们仍然需要判断用户是否在那个组中。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,我们也可以在 InstallShield 自定义操作支持的 vbscript 中执行此操作。虽然我仍然想知道是否在一些我可以直接调用的 win32 dll 中已经有类似的功能。
    【解决方案3】:

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

    我只会概述第一个,因为第二个非常复杂(即比第一个更复杂!)。显而易见的方法是 AD。下面的 sn-p 代码将告诉您是否存在用户名/密码组合。获得用户后,我相信您可以确定他们所在的组。

    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 之类的函数中。 (请记住,我的问题是验证凭据而不是检查管理员权限,但如果您准备挖掘,那里可能有一个链接)。

    希望这能有所帮助!

    【讨论】:

      猜你喜欢
      • 2014-05-01
      • 2018-02-02
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多