我知道以下函数以domain \ username格式返回当前Windows用户的名称。
Convert.ToString( WindowsIdentity.GetCurrent().Name );
但是如何以username@domain
格式获取用户名?
编辑:
我正在回复此编辑,因为所有回复的人都有相同的基本想法。
根据我的理解,从domain\username
格式解析名称并将其构建为username@domain
并不安全或不建议。我相信这是因为不能保证这两个域名在不同的格式中是相同的。例如,在我工作的公司中,domain
格式的domain\username
部分基于deparment,但在username@domain
中,它是公司名称。这是需要DNS查找的事情。
我希望有一个API执行此DNS查找。我想我应该把这些信息放到原来的问题中。遗憾。
答案 0 :(得分:9)
这样的事情应该有用......
string[] temp = Convert.ToString(WindowsIdentity.GetCurrent().Name).Split('\\');
string userName = temp[1] + "@" + temp[0];
答案 1 :(得分:3)
您可以使用\
作为分隔符来拆分名称,然后按顺序颠倒顺序:
string[] splitName = WindowsIdentity.GetCurrent().Name.Split('\\');
//check that splitName contains at least 2 values before using
string name = (splitName.Length > 1) ? splitName[1] + "@" + splitName[0] : null;
重要的是要注意,需要双反斜杠\\
,因为反斜杠是一个特殊字符。我们在上面的例子中添加了第二个反斜杠来转义特殊字符并将其用作常规字符。
答案 2 :(得分:3)
var input = WindowsIdentity.GetCurrent().Name ;
string[] tab = input.Split('\\');
var result = tab[1] + "@" + tab[0];
答案 3 :(得分:3)
以Domain\user name
格式获取名称并解析它的所有代码在所有情况下都不起作用。答案是您必须调用Active Directory才能获取用户主体名称。事实证明,我不能依赖桌面上安装的Active Directory,因为许多警察部门不会在他们的笔记本电脑上安装目录,以防警察在警察不在车内时被盗。 (谈论勇敢,从警车偷走电脑!)
我们已针对我们的情况提出了自己的解决方案。我们以Domain\user name
格式将用户名存储在我们的数据库中。程序启动时,它会检查当前的Windows用户名(格式是否相同)是否在数据库中。如果是,则程序将该用户用作当前用户并运行。如果当前Windows用户不在我们的数据库中,则该程序将回退到我们之前的代码。
这样,用户可以使用任何格式的用户名登录计算机,并通过Windows进行身份验证。我们的程序始终以相同的格式获取用户名,并始终以该格式检查用户名。 Windows对用户进行身份验证,而不是我们。
答案 4 :(得分:3)
使用
System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName
返回当前用户的UPN。需要引用System.DirectoryServices.AccountManagement。
答案 5 :(得分:0)
这些方面的东西。
var nameParts = WindowsIdentity.GetCurrent().Name.Split(@"\");
string name = nameParts.Length == 1
? nameParts
: string.format("{0}@{1}",nameParts[1],nameParts[0]);