【发布时间】:2009-08-17 17:47:52
【问题描述】:
我需要将我的应用程序的访问权限限制为只有一个特定的用户帐户。我在 WMI 下找到了用于查找用户帐户的类,但我不知道如何识别哪个正在运行我的应用程序。
【问题讨论】:
我需要将我的应用程序的访问权限限制为只有一个特定的用户帐户。我在 WMI 下找到了用于查找用户帐户的类,但我不知道如何识别哪个正在运行我的应用程序。
【问题讨论】:
有比使用 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。查看WindowsIdentity。
var identity = WindowsIdentity.GetCurrent();
var username = identity.Name;
【讨论】:
最简单的方法是通过 Environment 类:
string user = Environment.UserDomainName + "\\" + Environment.UserName;
还有几种方法可以限制特定用户(尽管检查角色更为常见)。
除了显而易见的
if (userName == "domain\\john")
{ }
您还可以在整个类或特定方法上使用以下属性:
[PrincipalPermission(SecurityAction.Demand, Name = "domain\\john",
Authenticated = true)]
void MyMethod()
{
}
这对于低级、可重用的方法可能更可靠一些。
请注意,您可以同时使用这两种方法,使用 if() 作为程序正常流程的一部分检查用户,并使用属性作为关键方法的保护措施。
【讨论】: