【问题标题】:How do I get the user name of the current user?如何获取当前用户的用户名?
【发布时间】:2014-08-21 14:41:24
【问题描述】:

我想使用 C 编程访问 Windows 中的用户名,并使用该名称创建特定文件的路径,例如“c:\users\john\Roaming.....等等”。因此,对于每个系统用户名,例如“john”,都是不同的。帮助我在运行时找到用户名。

【问题讨论】:

标签: c windows winapi


【解决方案1】:

你可以通过GetUserName获取当前用户的名字:

#include <Windows.h>
#include <Lmcons.h>
#include <stdio.h>

int main()
{
    char name[UNLEN + 1];
    DWORD cch = UNLEN + 1;
    if (GetUserName(name, &cch))
    {
        char cmd[100 + UNLEN + 1];
        sprintf(cmd, "echo The username is \"%s\"", name); // Silly demo command
        system(cmd);
    }
    return 0;
}

如果您想要特定格式的名称,请使用 GetUserNameEx

如果您需要获取“我的文档”或“桌面”等特殊文件夹的路径,则应使用 SHGetFolderPathSHGetKnownFolderPath 等特殊文件夹功能。

【讨论】:

    【解决方案2】:

    %USERNAME% 将为您提供用户名,但更好的解决方案是将其存储在 %USERPROFILE%\\Desktop\\key.txt 上,至少使其独立于操作系统。

    更好的解决方案是不在用户的桌面上存储私人信息。或任何地方。

    【讨论】:

    • 我将它存储在桌面上只是为了测试,不会真正保存在那里:D
    • 这个问题被标记为C,只有批处理文件应该使用环境变量。
    • 桌面文件夹可能不在用户配置文件根目录中!我也可以在启动程序之前执行“设置 USERNAME=Administrator”...
    • @Anders,如果你愿意,你可以删除你自己的硬盘,这与任何事情有什么关系?
    • 当您可以使用记录在案的函数时,您为什么要依赖脆弱的环境变量,而这些函数总是给出正确的结果?您的“%USERPROFILE%\Desktop”示例将为某些人返回错误的路径,恕我直言,它不应该是任何标记答案的一部分。再举一个例子。诸如 SCONS 之类的一些构建工具会删除大多数环境变量并重置 %PATH% 之类的内容,因此它有一个干净且可重复的环境。
    【解决方案3】:
    #include  <stdio.h>
    
    int main(void)
    {
        printf("%s\n", getenv("USERPROFILE"));  // Print user's home directory.
        return 0;
    }
    

    要获取用户名而不是主路径,请将 USERPROFILE 替换为 USERNAME

    【讨论】:

      【解决方案4】:

      您可以使用以下代码获取用户名。

          #include <stdlib.h>
      
          void main(void)
          {
              //following gets the appdata folder
              char szAppData[1024];
              char * szBufer      = 0;
              szBufer = getenv ("APPDATA");
              if (szBufer != NULL)
              {
                 strcpy(szBufer , szAppData);
              }
      
              //following code gets the user name
              char szOSUserName[1024];
              szBufer = getenv ("USERNAME");
              if (szBufer != NULL)
              {
                  strcpy(szBufer , szOSUserName);
              }
          }
      

      【讨论】:

        【解决方案5】:

        您在这里寻找的可能更多是SHGetKnownFolderPath。该功能可让您查找每个用户的特殊文件夹。这比查询用户名更受欢迎,因为主文件夹可能与用户的名称不同。

        WSTR* location;
        HRESULT hr = SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, NULL, &location);
        if (SUCCEEDED(hr))
        {
            // location contains the folder path
            // call CoTaskMemFree to free up the memory once you're done with it
            CoTaskMemFree(location);
        }
        

        所谓的已知文件夹列表在here可用。

        【讨论】:

        • 这很可能是 OP 需要的。获取每个用户的名称没有多大意义
        【解决方案6】:

        windows上获取用户名的函数是GetUserName

        This answer,或许,也会对你有所帮助。

        【讨论】:

        • 所有基本的 Win32 API 都是 C,GetUserName 也是 C,为什么你说它是 C++?您是否尝试单击答案中的链接,它不是您对该问题的评论中的链接。
        • 包含函数声明的框的类似标签的标题确实是 C++。我猜 MSDN 只是将 C 和 C++ 混为一谈。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多