2015-01-13 12 views
9

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

ответ

6

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

См getenv reference

14

Окна

Вы можете попробовать использовать 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 page of 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); 
+1

О [HOST_NAME_MAX] (http://stackoverflow.com/questions/30084116/host-name-max-undefined-after-include-limits-h). – Antonio

7

В системах 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") работал бы в обеих ситуациях.
2

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

3

Что касается ответа Дениса, обратите внимание, что getenv("HOSTNAME") для Linux may not always work because the environment variables may not be exported to the program.

Мультиплатформная 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 (gethostbyname(temp, 512) == 0) { // success = 0, failure = -1 
      computerName = temp; 
     } 
     delete []temp; 
     temp = 0; 
    } 
#endif 
1

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

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

Это единственный по-настоящему кросс-платформенный ответ на этот вопрос, спасибо! – oLen

Смежные вопросы