在InstallShield基本MSI项目中:如何检查用户名是否在管理员组中?
(不是我知道可以这样做的当前用户。)
在InstallShield基本MSI项目中:如何检查用户名是否在管理员组中?
(不是我知道可以这样做的当前用户。)
您可以运行“net localgroup administrators”并解析输出。我怀疑有更好的方法,但如果没有......
用户可以属于本地服务器上的“管理员”组,也可以是 AD 中定义的“域管理员”或“企业管理员”组的一部分。理想的解决方案是使用名为 IsUserAdmin(user_name) 的方法创建一个 DLL,该方法接受用户名参数并返回 true 或 false。
在内部,该方法将调用 IADsUser::Groups 方法来确定提供的用户所属的组,如果枚举的组属于上述管理员组之一,则返回 true。如果不是,它将返回 false。您可以在您的 InstallShield 项目中调用此 DLL。警惕嵌套组。
我可以想到两种方法,但是每种方法都涉及在安装脚本之上编写代码,我不再熟悉 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 之类的函数中。(请记住,我的问题是验证凭据而不是检查管理员权限,但如果您准备挖掘,那里可能有一个链接)。
希望有些帮助!