Как проверить, есть ли у всех пользователей в системе права администратора в C#

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

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

Я хочу знать права, предоставленные всем этим пользователям в 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";
}

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

ссылка на сайт

Приведенная ниже ссылка просто дает ссылку администраторам

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$");

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

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)

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

Другие вопросы по тегам