gpt4 book ai didi

c# - 获取当前用户的全名,返回一个空字符串(C#/C++)

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:48 25 4
gpt4 key购买 nike

  • 我尝试获取当前登录用户的全名(全名,而不是用户名)。

  • 以下代码 C#、C++ 工作正常,但在未连接到网络的 XP 计算机上,如果我在登录后约 20 分钟运行它,我得到的结果是空字符串(它在登录后的前约 20 分钟内运行正常登录)

  • 使用 Win32 API (GetUserNameEx) 而不是 PrincipalContext,因为它在脱机工作时 PrincipalContext 最多可能需要 15 秒。

  • 任何帮助,为什么我得到的结果是一个空字符串,尽管指定了用户全名???

- C#代码

    public static string CurrentUserFullName
{
get
{
const int EXTENDED_NAME_FORMAT_NAME_DISPLAY = 3;
StringBuilder userName = new StringBuilder(256);
uint length = (uint) userName.Capacity;
string ret;

if (GetUserNameEx(EXTENDED_NAME_FORMAT_NAME_DISPLAY, userName, ref length))
{
ret = userName.ToString();
}
else
{
int errorCode = Marshal.GetLastWin32Error();
throw new Win32Exception("GetUserNameEx Failed. Error code - " + errorCode);
}

return ret;
}
}

[DllImport("Secur32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool GetUserNameEx(int nameFormat, StringBuilder lpNameBuffer, ref uint lpnSize);

- C++ 代码

#include "stdafx.h"
#include <windows.h>
#define SECURITY_WIN32
#include <Security.h>
#pragma comment( lib, "Secur32.lib" )

int _tmain(int argc, _TCHAR* argv[])
{
char szName[100];
ULONG nChars = sizeof( szName );

if ( GetUserNameEx( NameDisplay, szName, &nChars ) )
{
printf( "Name: %s\n", szName);
}
else
{
printf( "Failed to GetUserNameEx\n" );
printf( "%d\n", GetLastError() );
}
return 0;
}

最佳答案

带有NameDisplayGetUserNameEx 函数不能在离线模式下工作。只有当计算机在线时才能访问此信息。我建议你实现一些信息的缓存,比如全名或其他只能在在线模式下访问的信息。例如,如果计算机在线,您可以检索并保存完整用户名等信息。因此,您可以在注册表中的某些配置文件中包含用户 SID 与其全名之间的映射。如果您不能直接提供全名,您可以从现金中获取信息。

Windows 有很多不同的通知(如 NotifyAddrChange),您可以(如果需要)使用它们来监视从在线模式到离线模式以及返回的变化。

您可以从 LsaGetLogonSessionDataWTSQuerySessionInformation API (GetUserNameEx你已经知道了),但你不会在里面找到完整的用户名。

如果您确实找到了在离线模式下获取用户全名的方法,请将信息发布给我。

关于c# - 获取当前用户的全名,返回一个空字符串(C#/C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2990340/

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