Je développe une application. L'une des méthodes doit capturer le nom de l'ordinateur et l'utilisateur connecté à l'ordinateur, puis les afficher à l'utilisateur J'en ai besoin pour fonctionner sous Windows et Linux. Quelle est la meilleure façon de procéder?
Les fenêtres
Vous pouvez essayer d'utiliser GetComputerName
et GetUserName
, voici un exemple:
#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 );
voir: GetComputerName et GetUserName
Linux
Utilisez gethostname
pour obtenir le nom de l'ordinateur (voir gethostname ) et getlogin_r
pour obtenir le nom d'utilisateur de connexion. Vous pouvez trouver plus d’informations sur page de manuel de getlogin_r . Une utilisation simple comme suit:
#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);
Si vous pouvez utiliser Boost, vous pouvez le faire pour obtenir facilement le nom d'hôte:
#include <boost/asio/ip/Host_name.hpp>
// ... whatever ...
auto Host_name = boost::asio::ip::Host_name();
Sur les systèmes POSIX, vous pouvez utiliser les fonctions gethostname
et getlogin
, toutes deux déclarées dans 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;
}
Sortie possible:
Hello 5gon12eder, you are logged in to example.com.
Cela semble plus sûr que de compter sur des variables d'environnement qui ne sont pas toujours présentes.
Je retire cette dernière déclaration parce que
getlogin
décourage en fait son utilisation en faveur de getenv("LOGIN")
etgetlogin_r
dans le programme ci-dessus échoue avec ENOTTY
lorsque j’exécute le programme depuis Emacs au lieu d’un terminal interactif, alors que getenv("USER")
aurait fonctionné dans les deux cas.Dans l'environnement Windows, vous pouvez utiliser getenv("COMPUTERNAME")
, getenv("USERNAME")
Dans Linux - getenv("HOSTNAME")
, getenv("USER")
Voir Référence de getenv
Concernant la réponse de Denis, notez que getenv("HOSTNAME")
pour Linux peut ne pas toujours fonctionner car les variables d'environnement ne peuvent pas être exportées vers le programme .
Exemple de code multi-plateforme C++ pour extraire uniquement le nom de l'ordinateur (c'est ce qui a fonctionné pour mes machines Win7 et 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