如何在Python中获取Windows用户的全名?

7

我想获取用户的全名,而不是登录名,即在Windows 7开始菜单右上方显示的全名。它可能只在活动目录设置中显示为全名。

os.environ['USERNAME']
win32api.GetUserName()

这两个都返回登录名,我该如何获取用户的全名?

你尝试过这些选项之一吗?https://dev59.com/KmYr5IYBdhLWcg3wdqCv - Noel Evans
@NoelEvans 这些还会返回登录名 - Brian Schlenker
2个回答

20

简单搜索得到了这个链接

以及以下代码:

import ctypes
 
def get_display_name():
    GetUserNameEx = ctypes.windll.secur32.GetUserNameExW
    NameDisplay = 3
 
    size = ctypes.pointer(ctypes.c_ulong(0))
    GetUserNameEx(NameDisplay, None, size)
 
    nameBuffer = ctypes.create_unicode_buffer(size.contents.value)
    GetUserNameEx(NameDisplay, nameBuffer, size)
    return nameBuffer.value

已在Windows XP上测试并可用


正如OP在此评论中指出的那样,pywin32将该API调用封装成一个更简单的函数:

win32api.GetUserName(3)

GetUserName指向ctypes.windll.secur32.GetUserNameExW,且3是来自ctypes常量的相同3


2
刚刚发现,如果您已经安装了pywin32,您也可以使用win32api.GetUserName(3)。 - Brian Schlenker
1
并且这里有一个文档链接:http://msdn.microsoft.com/en-us/library/windows/desktop/ms724435(v=vs.85).aspx。EXTENDED_NAME_FORMAT解释了此函数的不同参数的含义。 - Brian Schlenker
8
我正在使用 pywin32 版本为219(截至目前为止的最新版本),而 win32api.GetUserName 不接受任何参数。我必须使用 win32api.GetUserNameEx(3),这个方法非常好用。不确定这是否会给其他人带来问题。 - self.

3

如需更详细的信息:

import ctypes
 
def get_data(EXTENDED_NAME_FORMAT: int):
    GetUserNameEx = ctypes.windll.secur32.GetUserNameExW
    data = EXTENDED_NAME_FORMAT
 
    size = ctypes.pointer(ctypes.c_ulong(0))
    GetUserNameEx(data, None, size)
 
    nameBuffer = ctypes.create_unicode_buffer(size.contents.value)
    GetUserNameEx(data, nameBuffer, size)
    return nameBuffer.value

print("NameUnknown            : ", get_data(0))
print("NameFullyQualifiedDN   : ", get_data(1))
print("NameSamCompatible      : ", get_data(2))
print("NameDisplay            : ", get_data(3))
print("NameUniqueId           : ", get_data(6))
print("NameCanonical          : ", get_data(7))
print("NameUserPrincipal      : ", get_data(8))
print("NameCanonicalEx        : ", get_data(9))
print("NameServicePrincipal   : ", get_data(10))
print("NameDnsDomain          : ", get_data(12))

输出示例:

NameUnknown            :  
NameFullyQualifiedDN   :  CN=Tomasevic Milovan (TomasevicM),OU=Engineering,DC=Microsoft,DC=Com
NameSamCompatible      :  Microsoft\TomasevicM
NameDisplay            :  Tomašević Milovan
NameUniqueId           :  {4fa050f0-f561-11cf-bdd9-00aa003a77b6}
NameCanonical          :  Microsoft.Com/Engineering/Tomasevic Milovan (TomasevicM)
NameUserPrincipal      :  TomasevicM@Microsoft.Com
NameCanonicalEx        :  Microsoft.Com/Engineering Tomasevic Milovan (TomasevicM)
NameServicePrincipal   :
NameDnsDomain          :  Microsoft.Com\TomasevicM

常量

  • NameUnknown: 未知的名称类型。
  • NameFullyQualifiedDN: 完全限定的区别名称(例如,CN=Jeff Smith,OU=Users,DC=Engineering,DC=Microsoft,DC=Com)。
  • NameSamCompatible: 旧版帐户名称(例如,Engineering\JSmith)。仅域版本包括尾随反斜杠 ()。
  • NameDisplay: “友好”的显示名称(例如,Jeff Smith)。显示名称不一定是定义相对区别名称(RDN)。
  • NameUniqueId: IIDFromString 函数返回的 GUID 字符串(例如,{4fa050f0-f561-11cf-bdd9-00aa003a77b6})。
  • NameCanonical: 完整的规范名称(例如,engineering.microsoft.com/software/someone)。仅域版本包括尾随正斜杠 (/)。
  • NameUserPrincipal: 用户主体名称(例如,someone@example.com)。
  • NameCanonicalEx: 与 NameCanonical 相同,只是将最右侧的正斜杠 (/) 替换为换行符 (\n),即使在仅域情况下也是如此(例如,engineering.microsoft.com/software\nJSmith)。
  • NameServicePrincipal: 广义服务主体名称(例如,www/www.microsoft.com@microsoft.com)。
  • NameDnsDomain: DNS 域名后跟反斜杠和 SAM 用户名称。

要求

  • 最低支持的客户端:Windows 2000 Professional [仅桌面应用程序]
  • 最低支持的服务器:Windows 2000 Server [仅桌面应用程序]
  • 头文件:secext.h(包括 Security.h)

1
在Win11上,它只为我显示了NameSamCompatible。 - eri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接