如何判断用户账户是否存在

13
  1. 如何确定在我的 Windows 操作系统(Vista)上存在一个用户账户?我需要从未加入任何域的独立机器获得此信息。

  2. 我想知道一个用户是否属于一个组,例如用户“admin”是否属于“Administrators”组。


你可能想查看这个论坛帖子。它将通过WMI列出机器上的用户枚举列表。然后,您可以检查您的帐户是否在其中。该论坛链接到一个有关代码项目的文章。我认为您也可以通过WMI获取组成员身份,但我可能错了。 - Joshua Cauble
2个回答

12

您可以使用以下代码通过 System.Security.Principal 命名空间来确定本地帐户是否存在。

bool AccountExists(string name)
{
    bool bRet = false;

    try
    {
        NTAccount acct = new NTAccount(name);
        SecurityIdentifier id = (SecurityIdentifier)acct.Translate(typeof(SecurityIdentifier));

        bRet = id.IsAccountSid();
    }
    catch (IdentityNotMappedException)
    {
        /* Invalid user account */
    }

    return bRet;
}

现在获取组成员资格略微困难,您可以使用WindowsPrinciple.IsInRole方法轻松地为当前用户执行此操作(使用WindowsIdentify.GetCurrent()方法创建原则)。

正如指出的那样,我认为除了诉诸PInvoke或WMI之外,没有其他方法可以获得任何其他内容。因此,以下是一些使用WMI检查组成员身份的代码示例。

bool IsUserInGroup(string name, string group)
{
    bool bRet = false;
    ObjectQuery query = new ObjectQuery(String.Format("SELECT * FROM Win32_UserAccount WHERE Name='{0}' AND LocalAccount=True", name));
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
    ManagementObjectCollection objs = searcher.Get();

    foreach (ManagementObject o in objs)
    {
        ManagementObjectCollection coll = o.GetRelated("Win32_Group");
        foreach (ManagementObject g in coll)
        {
            bool local = (bool)g["LocalAccount"];
            string groupName = (string)g["Name"];

            if (local && groupName.Equals(group, StringComparison.InvariantCultureIgnoreCase))
            {
                bRet = true;
                break;
            }
        }
    }           

    return bRet;
}

非常感谢 tyranid。它正在工作,但有点慢。无论如何,再次感谢!! - satya
如果你将NTAccount更改为这个NTAccount acct = new NTAccount(Environment.MachineName,name);,速度会快很多。但是,结果可能因人而异。 - Tollo

2

我尝试了以下代码,它对我来说运行良好。

    public bool IsUserMemberOfGroup(string userName, string groupName)
    {
        bool ret = false;

        try
        {
            DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + Environment.MachineName);
            DirectoryEntry userGroup = localMachine.Children.Find(groupName, "group");

            object members = userGroup.Invoke("members", null);
            foreach (object groupMember in (IEnumerable)members)
            {
                DirectoryEntry member = new DirectoryEntry(groupMember);
                if (member.Name.Equals(userName, StringComparison.CurrentCultureIgnoreCase))
                {
                    ret = true;
                   break;
                }
            }
        }
        catch (Exception ex)
        {
            ret = false;
        }
        return ret;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接