Я разрабатываю приложение. Один из методов должен захватить имя компьютера и пользователя, зарегистрированные на компьютере, а затем отобразить их как пользователю. Мне нужно, чтобы он работал как на 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;
}