web-dev-qa-db-ja.com

コンピューター名とログに記録されたユーザー名を取得する

アプリケーションを開発しています。いずれかの方法では、コンピューターにログオンしているコンピューター名とユーザーをキャプチャし、両方をユーザーに表示する必要があります。 WindowsとLinuxの両方で実行する必要があります。これを行う最良の方法は何ですか?

16
Mrdk

Windows

GetComputerNameGetUserNameを使用してみてください。以下に例を示します。

#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ログインユーザー名を取得します。 getlogin_rのmanページ で詳細を見ることができます。次のような簡単な使用法:

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

Boostを使用できる場合、これを実行してホスト名を簡単に取得できます。

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

Windows環境では、getenv("COMPUTERNAME")getenv("USERNAME")を使用できます
InLinux-getenv("HOSTNAME")getenv("USER")

getenv reference を参照してください

9
Denis Itskovich

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のmanページでは、実際にgetenv("LOGIN")を優先して使用を推奨していません。
  • 上記のプログラムの_getlogin_r_呼び出しは、getenv("USER")が両方の状況で機能するのに、インタラクティブ端末ではなくEmacs内からプログラムを実行するとENOTTYで失敗します。
9
5gon12eder

Denisの答えに関して、Linuxのgetenv("HOSTNAME")環境変数がプログラムにエクスポートされない可能性があるため、常に機能するとは限りません に注意してください。

コンピューター名のみを取得するマルチプラットフォーム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
4
Keith M

gethostname()を使用してコンピューター名を取得し、 windowslinux の両方をサポートします。

3
Keven

linuxでは、Posixライブラリを使用して次を使用して、プロセスを所有する実ユーザーを取得することもできます。getuid()は、呼び出しプロセスの実ユーザーIDを返します。 getuid manページ を参照してください

#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