gpt4 book ai didi

c# - 获取 Windows 用户显示名称的可靠方法

转载 作者:太空狗 更新时间:2023-10-29 20:30:30 35 4
gpt4 key购买 nike

我需要获取当前用户的显示名称,但找不到始终有效的解决方案。为清楚起见,我不是在寻找用户名。我需要“无名氏”。 “开始”菜单上显示的值。

关于这个问题的帖子很多,但没有一个能解决我的问题。

Get Windows User Display Name

How do I get the AD Display Name of the currently logged in user

这两个帖子将我引向:

PrincipalContext context = domain.Equals(Environment.MachineName, StringComparison.CurrentCultureIgnoreCase) ?
new PrincipalContext(ContextType.Machine) :
new PrincipalContext(ContextType.Domain, domain);

UserPrincipal userPrincipal = new UserPrincipal(context) { SamAccountName = username };
PrincipalSearcher searcher = new PrincipalSearcher(userPrincipal);
userPrincipal = searcher.FindOne() as UserPrincipal;

string displayName = userPrincipal.DisplayName;

这段代码大部分都有效。但是,如果用户在他/她的计算机上禁用/停止了服务器服务,我会收到一个异常消息“服务器服务未启动。”

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName

同样的错误。

How to get logged-in user's full name in windows?

StringBuilder name = new StringBuilder(1024);
uint userNameSize = (uint)name.Capacity;
const int NameDisplay = 3;
GetUserNameEx(NameDisplay, name, ref userNameSize)

不返回错误,但如果用户不在域中则返回空字符串。

How do you read the user's display (first and last) name on all versions of Windows reliably?

// get SAM compatible name <server/machine>\\<username>
if (0 != GetUserNameEx(2, username, ref userNameSize))
{
IntPtr bufPtr;
try
{
string domain = Regex.Replace(username.ToString(), @"(.+)\\.+", @"$1");
DirectoryContext context = new DirectoryContext(DirectoryContextType.Domain, domain);
DomainController dc = DomainController.FindOne(context);

if (0 == NetUserGetInfo(dc.IPAddress,
Regex.Replace(username.ToString(), @".+\\(.+)", "$1"),
10, out bufPtr))
{
var userInfo = (USER_INFO_10) Marshal.PtrToStructure(bufPtr, typeof (USER_INFO_10));
return Regex.Replace(userInfo.usri10_full_name, @"(\S+), (\S+)", "$2 $1");
}
}
finally
{
NetApiBufferFree(out bufPtr);
}
}

在调用 DomainController.FindOne 时,我得到一个 ActiveDirectoryObjectNotFoundException 消息“在域中找不到域 Controller ..”。

我没有找到显示名称的注册表设置。

我不知道还能尝试什么。请帮忙。

最佳答案

以上所有方法仅在您位于域中时才有效。如果不是,则必须依赖本地用户帐户存储。以下详细说明了如何检索此信息:How can I get a list Local Windows Users (Only the Users that appear in the windows Logon Screen) .但在域情况下,用户帐户不会在本地商店中。

如果您在域中但未连接到域 Controller ,则您将无法随时使用显示名称。此信息存储在域 Controller 上,而不是本地用户的计算机上。如果您的用户在域中,他们真的不应该禁用服务器服务(使用 GPO)。此外,他们失去的不仅仅是通过禁用该服务来检索其用户帐户的能力。

在尝试获取显示名称之前,我会检查域的可用性。如果失败,则显示一条指示失败的消息。这里可能有太多的边缘情况,无法解决所有这些问题。根据您打算使用该程序的场景进行操作,并为其他场景提供错误消息。

关于c# - 获取 Windows 用户显示名称的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27992083/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com