Как проверить, есть ли у каждого пользователя в системе права администратора в С#

У меня есть список пользователей, созданный в моей системе:

  • Администратор (по умолчанию)
  • Гость
  • Пользователь 1 (стандартный пользователь)
  • User2 (пользователь-администратор)

Я хочу знать права, предоставленные всем этим пользователям в C # через WMI, как это возможно? Есть ли другой способ их найти. Даже если один пользователь имеет это право, он должен выйти из цикла

Я использую приведенный ниже код:

WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
if (isAdmin == true)
{
    current_logged_user = "Yes";
}
else
{
    current_logged_user = "No";
}

Это дает мне только текущую зарегистрированную информацию, но мне нужно для всех пользователей

ссылка

Ссылка ниже просто дает членам администраторов ссылка


person TechBrkTru    schedule 11.06.2015    source источник


Ответы (2)


Вы должны иметь возможность вернуть всех пользователей через WMI с помощью

        string groupNameToSearchFor = "Administrators"; // can be any group,maybe better to use something like builtin.administrators

        using (PrincipalContext pc = new PrincipalContext(ContextType.Machine, null))
        {
            ManagementObjectSearcher usersSearcher = new ManagementObjectSearcher(@"SELECT * FROM Win32_UserAccount");
            ManagementObjectCollection users = usersSearcher.Get();

            foreach (ManagementObject user in users)
            {
                if ((bool)user["LocalAccount"] == true && int.Parse(user["SIDType"].ToString()) == 1)
                {
                    var userPrincipal = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, user["Name"].ToString());
                    GroupPrincipal gp = GroupPrincipal.FindByIdentity(pc, groupNameToSearchFor);
                    MessageBox.Show("Is User admin? -> " + (bool)userPrincipal.IsMemberOf(gp));

                }
            }
        }

Вы должны включить использование для

using System.DirectoryServices.AccountManagement;
using System.Management;

А также проверить, действительно ли пользователь является пользователем, а не другим объектом (не уверен, что моих проверок достаточно).


Редактировать: вы можете использовать нужных вам пользователей после того, как вы получили список с помощью

        var localUsers = users.Cast<ManagementObject>().Where(
            u => (bool)u["LocalAccount"] == true &&
                 (bool)u["Disabled"] == false &&
                 (bool)u["Lockout"] == false &&
                 int.Parse(u["SIDType"].ToString()) == 1 &&
                 u["Name"].ToString() != "HomeGroupUser$");
person Marc Wittmann    schedule 11.06.2015
comment
Ваша локальная машина. Вы также можете искать в активном каталоге, но вам нужны локальные пользователи, верно? - person Marc Wittmann; 11.06.2015
comment
когда я использую администраторов, я получаю исключение ?? почему??@Марк Виттманн - person TechBrkTru; 11.06.2015
comment
Я получаю сообщение об ошибке: локальная переменная с именем «пользователь» не может быть объявлена ​​в этой области, потому что она придаст другое значение «пользователю», который уже используется в «родительской или текущей» области для обозначения чего-то еще @Marc Виттманн - person TechBrkTru; 11.06.2015
comment
это означает, что у вас уже есть объявленная пользовательская переменная. Просто переименуйте свою или мою пользовательскую переменную во что-то еще, например, userToCheck или что-то в этом роде. И убедитесь, что вы используете только реальных пользователей в цикле (отладьте цикл) - person Marc Wittmann; 11.06.2015
comment
Будет ли этот код работать на каждой отдельной локальной машине, потому что в настоящее время он правильно работает на моей.. @ Marc Wittmann - person TechBrkTru; 11.06.2015

Вы можете попробовать это:

bool IsInGroup(string user, string group)
{
    using (var identity = new WindowsIdentity(user))
    {
        var principal = new WindowsPrincipal(identity);
        return principal.IsInRole(group);
    }
}

Вы можете изменить IsInRole(group) на IsInRole(WindowsBuiltInRole.Administrator)

У вас есть доменный сервер?

person Fabian Stern    schedule 11.06.2015
comment
я просто хочу знать, какие права были даны всем учетным записям пользователей, которые были созданы в моей единственной системе @Fabian Stern - person TechBrkTru; 11.06.2015
comment
Старайтесь избегать переменных/параметров с именем group. Это ключевое слово, которое используется в LINQ. - person Caramiriel; 11.06.2015