【发布时间】:2019-06-04 09:52:26
【问题描述】:
我正在为依赖 OAuth 协议的本地服务器 jupyterhub 开发身份验证系统。此外,它会在 Windows 上创建一个本地系统用户,以防它不存在。 使用python检查用户是否存在于Windows平台上的正确方法是什么? 这将包括系统使用 LDAP 身份验证并且用户至少登录机器一次的情况。
我正在寻找正确的 windows 替代类 unix:
import pwd
try:
pwd.getpwnam(user.name)
except Exception as e:
print(repr(e))
我当前的解决方案是检查f"os.environ["SystemDrive"]\Users\{username}" 文件夹是否存在。附带问题,目前的方法有什么缺点吗?
【问题讨论】:
-
安装 pywin32 后,请致电
win32net.NetUserGetInfo(None, username, 0)。如果调用失败,这会引发win32net.error。特别是如果找不到用户,e.winerror == NERR_UserNotFound。 pywin32 的winerror模块缺少来自 lmerr.h 的错误代码,因此我们必须对NERR_UserNotFound = 2221进行硬编码。 -
我可能过于简化了这个问题。这种方法的问题在于,如果系统使用 LDAP 身份验证,上述方法将失败。我将编辑指定的问题,我的兴趣是了解用户是否存在于本地或是否存在于目录中并至少登录一次。
-
好的,我以为您在寻找本地帐户。 AFAIK,如果具有相同名称的人使用域帐户登录,则创建具有给定名称的本地帐户没有问题。我认为 Windows 只会创建一个名为“username.local”的配置文件目录。反之亦然,如果域帐户在本地已存在同名用户帐户时登录,则域用户的配置文件目录为“用户名.”,甚至可以开始添加数字后缀,例如“.001”。
-
无论如何,看看“HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList”。配置文件列在以帐户 SID 字符串命名的子项中。您可以将字符串 SID 转换为 SID (
win32security.ConvertStringSidToSid) 并查找帐户名称、域和类型 (win32security.LookupAccountSid)。 -
所以我觉得寻找 C:\Users\X 目录的缺点是用户可能确实存在,但没有文件夹(还)。例如,我有一个本地帐户“X”,它没有 C:\Users\"X" 目录(我以域用户身份登录,所以有一个 C:\Users\"domain_user_name “文件夹虽然)。运行一些有用的命令:
net user- 产生所有本地用户,或通过 PowerShellGet-LocalUser username-you-want
标签: python-3.x windows