【问题标题】:Getting the process user name in C in Windows在Windows中获取C中的进程用户名
【发布时间】:2017-10-15 08:48:44
【问题描述】:

我正在编写一个 C 程序,我需要知道使用其 pid 的进程的用户名。有什么办法吗?

我写了以下代码:

int pid = getpid();
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);

hProcess 的值为 NULL; 我需要进程的用户名,我也可以在任务管理器中看到。 (顶层进程)。

还附上了任务管理器的截图。 Task Manager

【问题讨论】:

  • 请展示您迄今为止的研究/调试工作。请先阅读How to Ask页面。
  • 我无法在 C 中找到解决方案。我可以在 C++/C# 中完成,但由于语言限制,我只能使用 C 语言。我使用 getpid() 命令获得了当前进程的 pid,但我需要进程的用户名。
  • @nikhilsid 那么你如何在 C++ 中做到这一点?
  • 您可能正在寻找GetUserName 函数。如果你能用 C++ 做,那么你也能用 C 做,如果不能,请告诉我们原因,否则很难提供帮助。
  • 如果OpenProcess 正在返回NULL,这意味着调用失败。您需要致电GetLastError 查找错误代码。最可能的原因是进程 ID 无效或您的进程没有目标进程的访问权限。

标签: c windows process pid


【解决方案1】:

请试试这个代码

const char *getUserName()
{
  uid_t uid = geteuid();
  struct passwd *pw = getpwuid(uid);
  if (pw)
  {
    return pw->pw_name;
  }

  return "";
}

【讨论】:

  • return pw->pw_name; 不要返回指向由getpwuid() 返回的struct password 的指针。根据the POSIX standard for getpwuid()返回的指针和结构中的指针可能无效,或者结构或存储区域可能被后续调用getpwent()getpwnam()getpwuid() 覆盖。如果调用线程终止,返回的指针和结构中的指针也可能无效。
  • 除此之外,geteuid 和 getpwuid 都不存在于 Windows 上。
猜你喜欢
  • 2011-02-10
  • 2011-06-15
  • 2014-12-25
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
相关资源
最近更新 更多