Получив полное имя текущего пользователя, возвращает пустую строку (C # / C ++) - PullRequest
4 голосов
/ 07 июня 2010
  • Я пытаюсь получить полное имя текущего пользователя, вошедшего в систему (полное имя, а не имя пользователя).

  • Следующий код 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 ]

1 голос
/ 08 июня 2010

Функция GetUserNameEx с NameDisplay не может работать в автономном режиме . Эта информация доступна только когда компьютер подключен к сети. Я рекомендую вам реализовать некоторое кэширование информации, такой как полное имя или другую информацию, которая доступна только в режиме онлайн. Например, если компьютер подключен к сети, вы можете получить и сохранить такую ​​информацию, как полное имя пользователя. Таким образом, вы можете иметь в своем конфигурационном файле в реестре отображение между SID пользователя и его полным именем. Если вы не можете указать полное имя напрямую, вы можете получить информацию из своих денежных средств.

В Windows имеется множество различных уведомлений (например, NotifyAddrChange), которые можно использовать (при необходимости) для отслеживания изменений из онлайн-режима в автономный режим и обратно.

Большую часть информации, которую вы можете получить о текущем сеансе пользователя (также в автономном режиме), вы можете получить из LsaGetLogonSessionData и WTSQuerySessionInformation API (GetUserNameEx вы уже знаете), но вы не найдете полного имени пользователя внутри.

Если вы нашли способ получить полное имя пользователя в автономном режиме, пожалуйста, отправьте мне эту информацию.

0 голосов
/ 11 февраля 2013

Пожалуйста, попробуйте отключить UAC на вашем компьютере. Я думаю, это должно сработать после этого.

Шаги, чтобы отключить его.

  1. Перейти к панели управления.
  2. Тогда пользователям.
  3. Выберите учетную запись администратора, которую вы хотите сохранить.
  4. Удалите учетную запись с правами администратора, которую вы не хотите иметь.

Если в будущем вы захотите создать новую учетную запись с правами администратора, вы создадите учетную запись и сделаете ее учетной записью администратора, используя тип изменения учетной записи.

0 голосов
/ 03 августа 2010

Так что используйте 1-й, проверьте результат и затем вызовите 2-й через асинхронный делегат. Ваше приложение не получит никакой задержки, и полное имя определенно не является его основной функцией - я надеюсь: -)

0 голосов
/ 29 июля 2010

Мне любопытно: для «постоянно автономной» станции, где (в ОС) хранится имя пользователя? Просматривая панель управления «Пользователи», кажется, что локальным учетным записям некуда хранить «NameDisplay», есть только имя пользователя.

Где эти данные хранятся для несвязанного узла, было бы для меня загадкой. Если (на самом деле) данные хранятся только на контроллере домена, единственное, о чем я могу думать, это кэшировать информацию, как упоминалось ранее.

0 голосов
/ 07 июня 2010

Попробуйте использовать GetUserNameExA (для ASCII) вместо макроса GetUserNameEx. Это помогает? Выведите также выходные данные программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...