【问题标题】:What is the correct method to determine if a system user exists locally on windows?确定系统用户是否在Windows本地存在的正确方法是什么?
【发布时间】: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 - 产生所有本地用户,或通过 PowerShell Get-LocalUser username-you-want

标签: python-3.x windows


【解决方案1】:

这是一个使用 python 检查本地 Windows 用户是否存在的解决方案:

import subprocess
def local_user_exists_windows(username):
   r = subprocess.run("net user",stdout=subprocess.PIPE)
   #look for username in the output. Return carriage followed by line break followed by name, then space
   return f"\\r\\n{username.lower()} " in str(r.stdout).lower()

替代方法是使用正则表达式来查找用户名匹配(如果与多行一起使用,^ 是行首的正则表达式,\b 表示单词边界):

import re
re.findall(rf"^{username}\b", out,flags=re.MULTILINE | re.IGNORECASE)

请注意,\b 可以替换为 \s+,意思是空格字符一次或多次,并产生类似的结果。如果给定的用户名与 Windows 上的本地用户名完全匹配,上述函数将返回 True。

同样,我使用此解决方案的原因是检查路径 f"os.environ["SystemDrive"]\Users\{username}" 是否存在可能存在缺陷。例如,我有一个本地用户(例如local_username)通过net user 命令或通过查看“本地用户和组”控制面板存在的情况,但没有C:\Users\local_user_name 文件夹。我能想到的一个原因可能是用户从本地用户登录切换到使用域帐户,并且他们的用户文件夹被删除以节省空间,所以用户存在,但文件夹没有,等等)

net user 的调用获取本地用户 - 输出如下所示:

User accounts for \\SOME-WINDOWS-COMPUTER
-------------------------------------------------------------------------------
SomeUser                 Administrator            DefaultAccount
Guest                    local_admin              WDAGUtilityAccount

请注意此示例中的 SomeUser 前面是如何以 \r\n 后跟多个空格,因此如果您正在搜索的字符串包含在另一个字符串中,则在此字符串中查找用户名字符串可能会产生误报.

上面的解决方案对我有用,但已经测试了十分钟,可能还有其他更简单或更pythonic的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多