Проверьте, есть ли имя пользователя в группе администраторов - PullRequest
2 голосов
/ 10 апреля 2009

В InstallShield basic MSI проекте: как проверить, входит ли имя пользователя в группу администраторов?

(Не текущий пользователь, с которым я знаю, что это возможно.)

Ответы [ 3 ]

2 голосов
/ 11 апреля 2009

Вы можете запустить «net localgroup administrator» и проанализировать вывод. Я подозреваю, что есть лучший способ, но если нет ...

0 голосов
/ 04 мая 2011

Я могу подумать о двух подходах, однако каждый из них будет включать в себя написание кода сверх вашего сценария установки, я больше не знаком с 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. (Имейте в виду, что снова моя проблема заключалась в проверке учетных данных, а не проверке прав администратора, но, вероятно, там есть ссылка, если вы готовы копать).

Надеюсь, что это поможет!

0 голосов
/ 11 апреля 2009

Пользователи могут принадлежать к группе «Администраторы» на локальном сервере или могут входить в группы «Администраторы домена» или «Администраторы предприятия», определенные в вашей AD. Идеальным решением было бы создать DLL с методом IsUserAdmin (имя_пользователя), который принимает параметр имени пользователя и возвращает либо true, либо false.

Внутренне метод вызовет метод IADsUser :: Groups, чтобы определить группы, к которым принадлежит предоставленный пользователь, и вернет true, если перечисленные группы принадлежат одной из указанных выше групп администраторов. Если нет, он вернет false. Вы можете вызвать эту DLL внутри ваших проектов InstallShield. Остерегайтесь вложенных групп.

...