python-3.x 确定系统用户是否存在于windows本地的正确方法是什么?

w1e3prcc  于 2023-10-21  发布在  Python
关注(0)|答案(2)|浏览(154)

我正在为依赖于OAuth协议的本地服务器jupyterhub开发一个身份验证系统。此外,它在Windows上创建一个本地系统用户,以防它不存在。在windows平台上使用python检查用户是否存在的正确方法是什么?这包括系统使用LDAP身份验证并且用户至少登录过一次计算机的情况。
我正在寻找正确的windows替代unix样:

import pwd
try:
   pwd.getpwnam(user.name)
except Exception as e:
   print(repr(e))

我目前的解决方案是检查f"os.environ["SystemDrive"]\Users\{username}"文件夹是否存在。附带问题,目前的方法有什么缺点吗?

9avjhtql

9avjhtql1#

下面是一个使用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()

另一种方法是使用正则表达式来查找用户名匹配(如果与多行一起使用,则^是regex,表示行首,\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的方法来做到这一点。

2uluyalo

2uluyalo2#

此响应是对子进程(“net user”)答案的注解,因为我无法注解。我越来越有兴趣在窗口上更广泛地解决这个问题。为了解决这个问题“有没有一个更Python的方式?“我认为,在pwd标准模块将支持windows上达成了共识。我正忙碌着让jupyterhub和Jupyter-collab在windows10上工作,面临着类似的挑战。我也想试试网络用户。

相关问题