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?
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);
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();
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
getlogin
rät tatsächlich davon ab, zugunsten von getenv("LOGIN")
undgetlogin_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.In der Umgebung von Windows können Sie getenv("COMPUTERNAME")
, getenv("USERNAME")
verwenden.
In Linux - getenv("HOSTNAME")
, getenv("USER")
Siehe getenv Referenz
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
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;
}