ubuntuusers.de

c / c++: computer und user id auslesen

Status: Gelöst | Ubuntu-Version: Ubuntu 7.10 (Gutsy Gibbon)
Antworten |

Speedy2007

Anmeldungsdatum:
7. Januar 2007

Beiträge: 35

Hallo alle zusammen,

kann mir einer von Euch bitte weiterhelfen, wie ich unter C (und/oder C++) die ID des Users ermitteln kann? Dabei wäre auch interessant, die Computer-ID auszulesen.

Ich möchte für eine kleine Application einen Stempel mit Datum, Zeit und eben Benutzer erstellen. Hab zwar schon recherchiert, aber für letzteres noch nicht funktionierendes gefunden.

Am besten eine Standardfunktion, weil die Applikation mittelfristig Cross-Plattform fähig sein soll. Meine eingesetzten Compiler sind gcc unter Linux und cl (MS Visual C++ 2008 express) unter Windows.

Vielen Dank im Voraus für Eure Antworten.

Gruß, Speedy

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

getuid in unistd.h

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Speedy2007 schrieb:

kann mir einer von Euch bitte weiterhelfen, wie ich unter C (und/oder C++) die ID des Users ermitteln kann? Dabei wäre auch interessant, die Computer-ID auszulesen.

Was soll den die "Computer-ID" sein?

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Lunar schrieb:

Speedy2007 schrieb:

kann mir einer von Euch bitte weiterhelfen, wie ich unter C (und/oder C++) die ID des Users ermitteln kann? Dabei wäre auch interessant, die Computer-ID auszulesen.

Was soll den die "Computer-ID" sein?

Das hab ich mich auch schon gefragt 😮)

Speedy2007

(Themenstarter)

Anmeldungsdatum:
7. Januar 2007

Beiträge: 35

Ok, danke, das war genau was ich gesucht habe ☺

Unter Computer ID hab ich den Rechnername gemeint, mit der der Rechner im Netzwerk registriert ist. Sorry für die schlechte Ausdrucksweise...

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

gethostname aus der selben Header-Datei.

Speedy2007

(Themenstarter)

Anmeldungsdatum:
7. Januar 2007

Beiträge: 35

Hier der Vollständigkeit halber der ganze Quellcode:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <grp.h>
#include <pwd.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int
main (void)
{
  uid_t me;
  struct passwd *my_passwd;
  struct group *my_group;
  char **members;

  /* Get information about the user ID.  */
  me = getuid ();
  my_passwd = getpwuid (me);
  if (!my_passwd)
    {
      printf ("Couldn't find out about user %d.\n", (int) me);
      exit (EXIT_FAILURE);
    }

  /* Print the information.  */
  printf ("I am %s.\n", my_passwd->pw_gecos);
  printf ("My login name is %s.\n", my_passwd->pw_name);
  printf ("My uid is %d.\n", (int) (my_passwd->pw_uid));
  printf ("My home directory is %s.\n", my_passwd->pw_dir);
  printf ("My default shell is %s.\n", my_passwd->pw_shell);

  /* Get information about the default group ID.  */
  my_group = getgrgid (my_passwd->pw_gid);
  if (!my_group)
    {
      printf ("Couldn't find out about group %d.\n", (int) my_passwd->pw_gid);
      exit (EXIT_FAILURE);
    }

  /* Print the information.  */
  printf ("My default group is %s (%d).\n",
	  my_group->gr_name, (int) (my_passwd->pw_gid));
  printf ("The members of this group are:\n");
  members = my_group->gr_mem;
  while (*members)
    {
      printf ("  %s\n", *(members));
      members++;
    }

  return EXIT_SUCCESS;
}

Speedy2007

(Themenstarter)

Anmeldungsdatum:
7. Januar 2007

Beiträge: 35

Und wer sich für Cross Platform Programming interessiert hier das Äquivalent aus der Windows Welt (Advapi32.lib aus SDK nicht vergessen beim linken):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <windows.h>
#include <stdio.h>
#include <lmcons.h>
void main()
{
    LPTSTR lpszSystemInfo;      // pointer to system information string
    DWORD cchBuff = 256;        // size of user name
    TCHAR tchBuffer[UNLEN + 1]; // buffer for expanded string
           lpszSystemInfo = tchBuffer;
           // Get and display the user name.
           GetUserName(lpszSystemInfo, &cchBuff);
           printf("User name: %s\n", lpszSystemInfo);
       }

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Aus dem C-Standard:

5.1.2.2.1 Program startup

The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters: int main(void) { /* ... */ } or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared): int main(int argc, char *argv[]) { /* ... */ } or equivalent;8) or in some other implementation-defined manner.

Speedy2007

(Themenstarter)

Anmeldungsdatum:
7. Januar 2007

Beiträge: 35

Hallo Hello World,

danke für Deinen Hinweis, ja, das darf man so nicht stehen lassen. Den Code habe ich aus ner Microsoft Doku, und da ist diese Unsitte noch recht verbreitet. War im C89 Standard wohl aber noch erlaubt, und der Visual Compiler ist ja bekanntermaßen nicht standardkonform.

Ich werd mich bessern 😉

Gruß, Speedy

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Speedy2007

War im C89 Standard wohl aber noch erlaubt,

Nein.

und der Visual Compiler ist ja bekanntermaßen nicht standardkonform.

Der Microsoft-Compiler setzt ISO-C++ nahezu vollständig um (bis auf export-Templates, was fast kein Compiler kann). Es würde mich sehr wundern, wenn die C89-Unterstützung schlechter wäre. Der C99-Standard wird übrigens vom GNU-Compiler ebenfalls nicht umgesetzt.

Speedy2007

(Themenstarter)

Anmeldungsdatum:
7. Januar 2007

Beiträge: 35

Sorry, dieses Thema wollte ich nicht löschen.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Hello World schrieb:

Speedy2007

War im C89 Standard wohl aber noch erlaubt,

Nein.

und der Visual Compiler ist ja bekanntermaßen nicht standardkonform.

Der Microsoft-Compiler setzt ISO-C++ nahezu vollständig um (bis auf export-Templates, was fast kein Compiler kann). Es würde mich sehr wundern, wenn die C89-Unterstützung schlechter wäre. Der C99-Standard wird übrigens vom GNU-Compiler ebenfalls nicht umgesetzt.

Nicht vollständig. Dinge wie "Inline-Deklarationen" (e.g. for(int i=0; i < foo; ++i)) kann der gcc auch.

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Lunar schrieb:

Nicht vollständig. Dinge wie "Inline-Deklarationen" (e.g. for(int i=0; i < foo; ++i)) kann der gcc auch.

Stimmt. Ich wollte das eigentlich auch noch korrigieren, aber dabei hat mir die ach so tolle neue Boardsoftware einen Strich durch die Rechnung gemacht.

Antworten |