11

我知道以下函数以域\用户名格式返回当前 Windows 用户名。

Convert.ToString( WindowsIdentity.GetCurrent().Name );

但是如何获取username@domain格式中的用户名呢?

编辑:

我在此编辑中做出回应,因为所有回复的人都有相同的基本想法。

根据我的理解,从domain\username格式解析名称并将其构造为username@domain不安全或不建议的。我相信是这样,因为不能保证两个域名在不同格式下是相同的。例如,在我工作的公司中,格式的domain一部分domain\username是基于部门的,但在 中username@domain,它是公司名称。这是需要DNS查找的那种东西。

我希望有一个 API 可以进行 DNS 查找。我想我应该把这些信息放到我原来的问题中。对不起。

4

7 回答 7

12

像这样的东西应该工作......

string[] temp = Convert.ToString(WindowsIdentity.GetCurrent().Name).Split('\\');
string userName = temp[1] + "@" + temp[0];
于 2012-08-28T20:13:45.003 回答
4
var input =  WindowsIdentity.GetCurrent().Name ;
string[] tab = input.Split('\\');
var result = tab[1] + "@" +  tab[0];
于 2012-08-28T20:11:59.283 回答
4

Domain\user name格式获取名称并对其进行解析的所有代码并非在所有情况下都有效。答案是您必须调用 Active Directory 以获取用户主体名称。事实证明,我不能依赖安装在桌面上的 Active Directory,因为许多警察部门不会在他们的笔记本电脑上安装目录,以防警察不在车内时它被盗。(谈论勇敢,从警车里偷电脑!)

我们已经针对我们的情况提出了自己的解决方案。我们将用户名以Domain\user name格式存储在我们的数据库中。当程序启动时,它会检查当前的 windows 用户名(格式相同)是否在数据库中。如果是,程序将该用户用作当前用户并运行。如果当前 Windows 用户不在我们的数据库中,程序将回退到我们之前的代码。

这样,用户可以使用任何格式的用户名登录机器,并通过 Windows 进行身份验证。我们的程序总是获取相同格式的用户名,并且总是检查该格式的用户名。Windows 验证用户而不是我们。

于 2012-09-11T13:58:21.947 回答
4

采用

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName

这将返回当前用户的 UPN。需要对 System.DirectoryServices.AccountManagement 的引用。

于 2015-09-23T16:28:10.680 回答
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;

重要的是要注意双反斜杠\\是必需的,因为反斜杠是一个特殊字符。我们在上面的示例中添加了第二个反斜杠来转义特殊字符并将其用作常规字符。

于 2012-08-28T20:11:18.687 回答
0

沿着这些思路。

var nameParts = WindowsIdentity.GetCurrent().Name.Split(@"\");
string name = nameParts.Length == 1 
    ? nameParts  
    : string.format("{0}@{1}",nameParts[1],nameParts[0]);
于 2012-08-28T20:16:58.437 回答
0

我已经看到了很多相同的变体,为什么不把它放到一个函数中,比如:

string GetUserName()
{
    var currentName =  WindowsIdentity.GetCurrent()?.Name;
    if (string.IsNullOrEmpty(currentName)) return null;
    var nameSplit = currentName.Split(@"\");
    string name = (nameSplit.Length > 1)
                    ? $"{nameSplit[1]}@{nameSplit[0]}" : currentName;
    return name;
}
于 2022-01-31T08:34:59.793 回答