web-dev-qa-db-fra.com

Obtenir le nom de l'ordinateur et le nom d'utilisateur enregistré

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?

13
Mrdk

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);
18
pezy

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();
10
Vivit

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

  • la page de manuel de getlogin décourage en fait son utilisation en faveur de getenv("LOGIN") et
  • l’appel getlogin_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.
9
5gon12eder

Dans l'environnement Windows, vous pouvez utiliser getenv("COMPUTERNAME"), getenv("USERNAME")
Dans Linux - getenv("HOSTNAME"), getenv("USER")

Voir Référence de getenv

8
Denis Itskovich

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
3
Keith M

Utilisez gethostname() pour obtenir le nom de l'ordinateur, supportez les deux windows et linux .

3
Keven