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