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

时间:2010-06-07 14:27:36

标签: c# c++ winapi

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

  • 下面的代码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;
}

5 个答案:

答案 0 :(得分:1)

GetUserNameEx NameDisplay功能无法在离线模式下使用。只有在计算机联机时才能访问此信息。我建议您实现一些缓存信息,如全名或其他只能在在线模式下访问的信息。例如,如果计算机处于联机状态,则可以检索并保存完整用户名等信息。因此,您可以在注册表中的某些配置文件中包含用户SID与其全名之间的映射。如果您无法直接提供全名,您可以从现金中获取信息。

Windows有很多不同的通知(例如NotifyAddrChange),您可以使用它(如果需要)来监控从在线模式到离线模式的更改并返回。

您可以从LsaGetLogonSessionDataWTSQuerySessionInformation API(您已经知道的GetUserNameEx)获得有关当前用户会话(也在离线模式下)的大部分信息,但您不会在里面找到完整的用户名。

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

答案 1 :(得分:0)

尝试使用GetUserNameExA(对于ASCII)而不是GetUserNameEx宏。有帮助吗?打印程序的输出。

答案 2 :(得分:0)

我很好奇:对于'permamently offline'工作站,在哪里(在操作系统中)存储了用户名?通过浏览控制面板用户,看起来本地用户帐户没有地方存储'NameDisplay',只有一个用户名。

为非连接节点存储数据的位置对我来说是一个谜。如果(实际上)数据只与域控制器一起存储,我唯一能想到的就是缓存前面提到的信息。

答案 3 :(得分:0)

所以使用第一个,检查结果,然后通过异步委托调用第二个。你的应用程序不会有任何延迟和全名肯定不是它的核心功能 - 我希望: - )

答案 4 :(得分:-1)

请尝试在您的计算机上禁用UAC。我想它应该在那之后起作用。

禁用它的步骤。

  1. 转到控制面板。
  2. 然后给用户。
  3. 选择您要保留的管理员帐户。
  4. 删除您不希望拥有的具有管理员权限的帐户。
  5. 如果以后您想要创建具有管理员权限的任何新帐户,您可以使用更改帐户类型创建一个帐户并将其设为管理员帐户。

相关问题