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

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

Ответ 1

Окно

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

#define INFO_BUFFER_SIZE 32767
TCHAR  infoBuf[INFO_BUFFER_SIZE];
DWORD  bufCharCount = INFO_BUFFER_SIZE;

// Get and display the name of the computer.
if( !GetComputerName( infoBuf, &bufCharCount ) )
  printError( TEXT("GetComputerName") ); 
_tprintf( TEXT("\nComputer name:      %s"), infoBuf ); 

// Get and display the user name.
if( !GetUserName( infoBuf, &bufCharCount ) )
  printError( TEXT("GetUserName") ); 
_tprintf( TEXT("\nUser name:          %s"), infoBuf );

см. GetComputerName  и GetUserName

Linux

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

#include <unistd.h>
#include <limits.h>

char hostname[HOST_NAME_MAX];
char username[LOGIN_NAME_MAX];
gethostname(hostname, HOST_NAME_MAX);
getlogin_r(username, LOGIN_NAME_MAX);

Ответ 2

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

/*
   This is a C program (I've seen the C++ tag too late).  Converting
   it to a pretty C++ program is left as an exercise to the reader.
*/

#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int
main()
{
  char hostname[HOST_NAME_MAX];
  char username[LOGIN_NAME_MAX];
  int result;
  result = gethostname(hostname, HOST_NAME_MAX);
  if (result)
    {
      perror("gethostname");
      return EXIT_FAILURE;
    }
  result = getlogin_r(username, LOGIN_NAME_MAX);
  if (result)
    {
      perror("getlogin_r");
      return EXIT_FAILURE;
    }
  result = printf("Hello %s, you are logged in to %s.\n",
                  username, hostname);
  if (result < 0)
    {
      perror("printf");
      return EXIT_FAILURE;
    }
  return EXIT_SUCCESS;
}

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

Hello 5gon12eder, you are logged in to example.com.

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

Я снимаю последнее выражение, потому что

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

Ответ 3

В среде Windows вы можете использовать getenv("COMPUTERNAME"), getenv("USERNAME")
В Linux - getenv("HOSTNAME"), getenv("USER")

Смотрите ссылку на getenv

Ответ 4

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

#include <boost/asio/ip/host_name.hpp>
// ... whatever ...
auto host_name = boost::asio::ip::host_name();

Ответ 5

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

Ответ 6

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

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

    char *temp = 0;
    std::string computerName;

#if defined(WIN32) || defined(_WIN32) || defined(_WIN64)
    temp = getenv("COMPUTERNAME");
    if (temp != 0) {
        computerName = temp;
        temp = 0;
    }
#else
    temp = getenv("HOSTNAME");
    if (temp != 0) {
        computerName = temp;
        temp = 0;
    } else {
        temp = new char[512];
        if (gethostname(temp, 512) == 0) { // success = 0, failure = -1
            computerName = temp;
        }
        delete []temp;
        temp = 0;
    }
#endif

Ответ 7

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

#include <pwd.h>
string userName = "unknownUser";
// Structure to store user info
struct passwd p;
// Get user ID of the application
uid_t uid = getuid();

// Buffer that contains password additional information
char pwdBuffer[ourPwdBufferSize];
// Temporary structure for reentrant function
struct passwd* tempPwdPtr;

if ((getpwuid_r(uid, &p, pwdBuffer, sizeof(pwdBuffer),
        &tempPwdPtr)) == 0) {
    userName = p.pw_name;
}