wake-up-neo.com

Ermitteln Sie den Computernamen und den protokollierten Benutzernamen

Ich entwickle eine Anwendung. Eine der Methoden muss den Computernamen und den auf dem Computer angemeldeten Benutzer erfassen und dann dem Benutzer beide anzeigen. Ich brauche es für Windows und Linux. Was ist der beste Weg, dies zu tun?

13
Mrdk

Windows

Sie können versuchen, GetComputerName und GetUserName zu verwenden. Hier ein Beispiel:

#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 );

siehe: GetComputerName und GetUserName

Linux

Verwenden Sie gethostname, um den Computernamen abzurufen (siehe gethostname ), und getlogin_r, um den Login-Benutzernamen zu erhalten. Weitere Informationen finden Sie auf der man-Seite von getlogin_r . Einfache Verwendung wie folgt:

#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

Wenn Sie Boost verwenden können, können Sie den Hostnamen einfach abrufen:

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

Auf POSIX-Systemen können Sie die Funktionen gethostname und getlogin verwenden, die beide in unistd.h deklariert sind.

/*
   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;
}

Mögliche Ausgabe:

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

Dies scheint sicherer zu sein, als sich auf Umgebungsvariablen zu verlassen, die nicht immer vorhanden sind.

Ich ziehe die letzte Aussage zurück, weil

  • die Manpage von getlogin rät tatsächlich davon ab, zugunsten von getenv("LOGIN") und
  • der getlogin_r-Aufruf in dem obigen Programm schlägt mit ENOTTY fehl, wenn ich das Programm in Emacs anstelle eines interaktiven Terminals ausführe, während getenv("USER") in beiden Situationen funktioniert hätte.
9
5gon12eder

In der Umgebung von Windows können Sie getenv("COMPUTERNAME"), getenv("USERNAME") verwenden.
In Linux - getenv("HOSTNAME"), getenv("USER")

Siehe getenv Referenz

8
Denis Itskovich

Beachten Sie bezüglich der Antwort von Denis, dass getenv("HOSTNAME") für Linux möglicherweise nicht immer funktioniert, da die Umgebungsvariablen möglicherweise nicht in das Programm exportiert werden.

C++ - Codebeispiel für mehrere Plattformen, um nur den Computernamen abzurufen (dies funktionierte für meine Win7- und CentOS-Maschinen):

    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

Verwenden Sie gethostname(), um den Computernamen abzurufen, und unterstützen Sie sowohl windows als auch linux .

3
Keven

unter Linux können Sie auch die folgende Posix-Bibliothek verwenden, um den realen Benutzer abzurufen, der den Prozess besitzt: getuid () gibt die echte Benutzer-ID des aufrufenden Prozesses zurück . see getuid manpage

#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;
}
0
Michele Belotti