Получить имя компьютера и зарегистрированное имя пользователя

Я разрабатываю приложение. Один из методов должен захватить имя компьютера и пользователя, вошедшего в систему, а затем отобразить их для пользователя. Мне нужно, чтобы он работал как в Windows, так и в Linux. Как лучше всего это сделать?


Windows

Вы можете попробовать использовать GetComputerName и GetUserName , вот пример:

  #define INFO_BUFFER_SIZE 32767TCHAR infoBuf [INFO_BUFFER_SIZE]; DWORD bufCharCount = INFO_BUFFER_SIZE;//Получить и отобразить имя компьютера.if (! GetComputerName (infoBuf, & bufCharrrorComputerName (infoBuf, & bufCharrCount)) print  _tprintf (ТЕКСТ (" nИмя компьютера:% s"), infoBuf); //Получение и отображение имени пользователя. If (! GetUserName (infoBuf, & bufCharCount)) printError (TEXT ("GetUserName"));  _tprintf (TEXT (" nUser name:% s"), infoBuf);  

см .: GetComputerName и GetUserName

Linux

Используйте gethostname , чтобы получить имя компьютера (см. gethostname), и getlogin_r , чтобы получить имя пользователя для входа. Дополнительную информацию можно найти на странице руководства по getlogin_r. Простое использование следующим образом:

  #include  #include  char hostname [HOST_NAME_MAX];  char имя пользователя [LOGIN_NAME_MAX]; gethostname (имя хоста, HOST_NAME_MAX); getlogin_r (имя пользователя, LOGIN_NAME_MAX);  

2


Если вы можете использовать Boost, вы можете сделать это, чтобы легко получить имя хоста:

  #include //... что угодно ... const auto host_name = boost :: asio :: ip :: host_name ();  

2


В системах POSIX вы можете использовать gethostname и getlogin , обе объявлены в unistd.h .

 /* Это программа на C (я тоже видел тег C ++ l  съел).  Преобразование его в красивую программу на C ++ оставлено в качестве упражнения для читателя. */# Include  #include  #include  #include  intmain () {  символьное имя хоста [HOST_NAME_MAX];  char имя пользователя [LOGIN_NAME_MAX];  int результат;  результат = gethostname (имя хоста, HOST_NAME_MAX);  если (результат) {ошибка ("gethostname");  вернуть EXIT_FAILURE;  } результат = getlogin_r (имя пользователя, LOGIN_NAME_MAX);  если (результат) {ошибка ("getlogin_r");  вернуть EXIT_FAILURE;  } result = printf ("Здравствуйте,% s, вы вошли в систему% s.  n", имя пользователя, имя хоста);  если (результат  

Возможный вывод:

  Здравствуйте, 5gon12eder, вы вошли в систему на example.com.  

Это кажется более безопасным, чем полагаться на переменные среды, которые не всегда присутствуют.

Я снимаю это последний оператор, потому что

  • справочная страница getlogin на самом деле препятствует его использованию в пользу getenv ("LOGIN") и
  • вызов getlogin_r в приведенной выше программе завершается с ошибкой ENOTTY , когда я запускаю программу из Emacs интерактивного терминала, тогда как getenv ("USER") работал бы в обеих ситуациях.

Используйте gethostname () для получения имени компьютера, поддерживает как Windows, так и Linux .


По поводу ответа Дениса обратите внимание, что getenv ("HO STNAME ") для Linux может не всегда работать, потому что переменные среды не могут быть экспортированы в программу.

Пример многоплатформенного кода C ++ для получения только имени компьютера (это то, что работал на моих машинах Win7 и CentOS):

  char * temp = 0;  std :: string computerName; #if defined (WIN32) ||  определено (_WIN32) ||  определено (_WIN64) temp = getenv ("ИМЯ КОМПЬЮТЕРА");  если (темп! = 0) {имя_компьютера = темп;  temp = 0;  } #else temp = getenv ("ИМЯ ХОСТА");  если (темп! = 0) {имя_компьютера = темп;  темп = 0;  } еще {темп = новый символ [512];  if (gethostname (temp, 512) == 0) {//успех = 0, сбой = -1 computerName = temp;  } delete [] temp;  темп = 0;  } #endif  

1


в Linux вы также можете использовать следующее, используя библиотеку Posix для получения реального пользователя, которому принадлежит процесс: getuid () возвращает реальный идентификатор пользователя вызывающего процесса. см. справочную страницу getuid

  #include  string userName = "unknownUser";//Структура для хранения информации о пользователе struct passwd p;//Получение идентификатора пользователя приложения uid_t uid = getuid ();//Буфер, содержащий пароль  дополнительная информация char pwdBuffer [ourPwdBufferSize];//Временная структура для повторной входимой функции struct passwd * tempPwdPtr; if ((getpwuid_r (uid, & p, pwdBuffer, sizeof (pwdBuffer), & tempPwdPtr)) == p user. pw_name;}  



Как получить доступ к общему ресурсу C $ в сети?

Учитывая, что у меня есть доступ администратора к машине, как я могу удаленно получить доступ к общему ресурсу C $ по умолчанию в Windows XP и Windows 7?

Изменить: это не домен, это отдельная машина что мне нужно получить доступ


Есть несколько проблем, о которых следует помнить:

  1. Это должен быть компьютер с профессиональной версией Windows. В выпусках Home не включены административные общие ресурсы.
  2. Многие (если не большинство) сторонних брандмауэров отключают административные общие ресурсы по соображениям безопасности. Убедитесь, что брандмауэр хоста не отключил их.
  3. Если у вас отключен общий доступ к файлам, это не сработает. В XP убедитесь, что включен расширенный общий доступ, а не простой. В 7 проверьте настройки сети, чтобы убедиться, что включен общий доступ к файлам и принтерам. Это не относится к сетям, помеченным как Public.
  4. Убедитесь, что вы вводите путь напрямую — общие ресурсы Windows с именами, заканчивающимися на $ , невидимы и будут не отправляться в листингах акций. Вместо этого вы должны указать путь напрямую: \MachineNamec$.

1


У меня была такая же проблема в Windows 7, и это решило ее:
1. Перейдите в: HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion Policies System
2. Создайте значение DWORD с именем LocalAccountTokenFilterPolicy и присвойте ему значение 1
3. Перезапустите службу «Сервер» или перезагрузите компьютер

Вы также можете запустить эту команду из cmd с повышенными привилегиями, а затем перейти к шагу 3:

  REG ADD  HKLM  SOFTWARE  Microsoft  Windows  CurrentVersion  Policies  System/v LocalAccountTokenFilterPolicy/t REG_DWORD/d 1  

Кредит для wibier.me

2


Если вы не в домене: UAC предотвратит удаленный доступ в административные общие папки.

Параметры:

  • отключить UAC
  • включить встроенного администратора
  • установить параметр реестра, который разрешает удаленный UAC
    • путь: HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion Policies System
    • DWORD (32 бит) : LocalAccountTokenFilterPolicy = 1

Подробнее здесь https://4sysops. com/archives/access-denied-to-administrator-admin-share-in-windows-8/

или google для «удаленного административного общего ресурса uac»


Раньше у меня никогда не было проблем с этим, но есть несколько вещей, которые вы можете проверить:

  • Рабочая группа часто должна быть одинаковой на обеих машинах, чтобы они могли нормально взаимодействовать.
  • Используете ли вы Windows XP Professional или другую? (Дом, Медиацентр, Планшет). Эта функция активирована только в Professional Edition (см. Http://en.wikipedia.org/wiki/Administrative_share) — в основном потому, что она предназначена для корпоративных пользователей.
  • Попробуйте включить расширенный режим общего доступа в XP. Это через Проводник Windows -> Меню инструментов> Параметры папки -> Дополнительно (отключить простой общий доступ к файлам)

Надеюсь, что-то из этого поможет.

2


Да, если у вас есть права администратора, вам просто нужно использовать UNC-путь к машине — \ machinename c $ или даже \ IPAddress c $.


Большинство скорее всего, да … запретить любой брандмауэр или политики безопасности (назначение прав пользователей или параметры безопасности), предотвращающие это.

1


Вы не сможете перейти к общему ресурсу. Общие ресурсы, заканчивающиеся на $, скрыты в проводнике, даже если у вас включены параметры «Показать скрытые файлы» и «Показать защищенные файлы операционной системы». Вы должны ввести имя прямо в адресную строку, чтобы увидеть общий ресурс.


Если ваша система не является членом домена (который, по вашему мнению, не является), и учетная запись пользователя, в которую вы вошли в свою локальную систему, не существует в системе, к которой вы пытаетесь подключиться, вам, возможно, придется поставить в учетных данных пользователя, например:

  \ machinename  c $/user: machinename  user  

(где ‘user ‘аккаунт существует на’ machinename ‘).

1

Оцените статью
clickpad.ru
Добавить комментарий