我尝试获取当前登录用户的全名(Fullname,而不是用户名)。
下面的代码C#,C ++工作正常但是在没有连接到网络的XP计算机上,如果我运行它,我得到空字符串〜登录后20分钟(它在第一个~20分钟后运行正常登录)
使用Win32 API(GetUserNameEx)而不是PrincipalContext,因为PrincipalContext在离线工作时最多可能需要15秒。
任何帮助虽然指定了用户全名,但为什么我得到一个空字符串???
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);
#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;
}
答案 0 :(得分:1)
GetUserNameEx
NameDisplay
功能无法在离线模式下使用。只有在计算机联机时才能访问此信息。我建议您实现一些缓存信息,如全名或其他只能在在线模式下访问的信息。例如,如果计算机处于联机状态,则可以检索并保存完整用户名等信息。因此,您可以在注册表中的某些配置文件中包含用户SID与其全名之间的映射。如果您无法直接提供全名,您可以从现金中获取信息。
Windows有很多不同的通知(例如NotifyAddrChange
),您可以使用它(如果需要)来监控从在线模式到离线模式的更改并返回。
您可以从LsaGetLogonSessionData
和WTSQuerySessionInformation
API(您已经知道的GetUserNameEx
)获得有关当前用户会话(也在离线模式下)的大部分信息,但您不会在里面找到完整的用户名。
如果您确实找到了一种在离线模式下获取用户全名的方法,请将信息发布给我。
答案 1 :(得分:0)
尝试使用GetUserNameExA(对于ASCII)而不是GetUserNameEx宏。有帮助吗?打印程序的输出。
答案 2 :(得分:0)
我很好奇:对于'permamently offline'工作站,在哪里(在操作系统中)存储了用户名?通过浏览控制面板用户,看起来本地用户帐户没有地方存储'NameDisplay',只有一个用户名。
为非连接节点存储数据的位置对我来说是一个谜。如果(实际上)数据只与域控制器一起存储,我唯一能想到的就是缓存前面提到的信息。
答案 3 :(得分:0)
所以使用第一个,检查结果,然后通过异步委托调用第二个。你的应用程序不会有任何延迟和全名肯定不是它的核心功能 - 我希望: - )
答案 4 :(得分:-1)
请尝试在您的计算机上禁用UAC。我想它应该在那之后起作用。
禁用它的步骤。
如果以后您想要创建具有管理员权限的任何新帐户,您可以使用更改帐户类型创建一个帐户并将其设为管理员帐户。