【问题标题】:With WMI: How can I get the name of the user account who's running my program?使用 WMI:如何获取运行我的程序的用户帐户的名称?
【发布时间】:2009-08-17 17:47:52
【问题描述】:

我需要将我的应用程序的访问权限限制为只有一个特定的用户帐户。我在 WMI 下找到了用于查找用户帐户的类,但我不知道如何识别哪个正在运行我的应用程序。

【问题讨论】:

    标签: c# wmi


    【解决方案1】:

    有比使用 WMI 更简单的方法来获取当前用户名。

    WindowsIdentity.GetCurrent().Name 将为您获取当前 Windows 用户的名称。

    Environment.Username 将为您获取当前登录用户的名称。

    这两者之间的区别在于WindowsIdentity.GetCurrent().Name 还将包括域名和用户名(即MYDOMAIN\adrian 而不是adrian)。如果需要Environment的域名,可以使用Environment.UserDomainName

    编辑

    如果你真的想用 WMI 来做,你可以这样做:

    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem");
    ManagementObjectCollection collection = searcher.Get();
    string username = (string) collection.Cast<ManagementBaseObject>().First()["UserName"];
    

    不幸的是,ManagementObjectCollection 上没有 indexer 属性,因此您必须枚举它才能获得第一个(也是唯一一个)结果。

    【讨论】:

    • 谢谢,它更容易,我会使用它,但是¿有没有办法用 WMI 做到这一点?
    【解决方案2】:

    您不一定需要使用 WMI。查看WindowsIdentity

    var identity = WindowsIdentity.GetCurrent();
    var username = identity.Name;
    

    【讨论】:

      【解决方案3】:

      最简单的方法是通过 Environment 类:

      string user = Environment.UserDomainName + "\\" + Environment.UserName;
      

      还有几种方法可以限制特定用户(尽管检查角色更为常见)。

      除了显而易见的

      if (userName == "domain\\john") 
      {  }
      

      您还可以在整个类或特定方法上使用以下属性:

      [PrincipalPermission(SecurityAction.Demand,  Name = "domain\\john", 
            Authenticated = true)] 
      void MyMethod() 
      { 
      }
      

      这对于低级、可重用的方法可能更可靠一些。

      请注意,您可以同时使用这两种方法,使用 if() 作为程序正常流程的一部分检查用户,并使用属性作为关键方法的保护措施。

      【讨论】:

        猜你喜欢
        • 2014-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-27
        • 2020-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多