【问题标题】:How to know whether an user account exists如何知道用户帐户是否存在
【发布时间】:2010-01-11 16:43:51
【问题描述】:
  1. 我如何知道我的 Windows 操作系统 (Vista) 上是否存在用户帐户?我需要来自未加入任何域的独立计算机的此信息。

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

【问题讨论】:

  • 你可能想看看这个forum post。它将通过计算机上的用户的 WMI 为您提供枚举列表。然后,您可以检查您的帐户是否存在。该论坛还链接到code project 上的一篇文章。我相信您也可以通过 WMI 获得组成员身份,但我可能错了。

标签: c# windows user-accounts


【解决方案1】:

您可以使用以下代码通过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;
}

【讨论】:

  • 非常感谢泰伦。它正在工作,但有点慢。无论如何,再次感谢!
  • 如果将 NTAccount 更改为此 NTAccount acct = new NTAccount(Environment.MachineName,name);它快了很多。 YMMV。
【解决方案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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 2017-06-15
    • 1970-01-01
    相关资源
    最近更新 更多