V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
slysly759
V2EX  ›  Python

急!求助 Python 获取 windows 域用户名的方法

  •  
  •   slysly759 · 2016-08-04 20:02:43 +08:00 · 8180 次点击
    这是一个创建于 3015 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刚刚 Boss 说了一个新需求,说要实现 Python 获取域用户名(不是电脑名),想请教一下该如何实现呢 我刚刚查了一下好像有一个 ldap 的库 除此之外还要实现域用户的登陆。时间紧急,希望能有 Python 大神赐教~Thx in advance.

    16 条回复    2016-08-05 13:40:37 +08:00
    shaivas
        1
    shaivas  
       2016-08-04 20:06:15 +08:00 via Android
    获取域用户名可以通过系统命令
    infun
        2
    infun  
       2016-08-04 20:16:19 +08:00
    os.system(cmd)
    upczww
        3
    upczww  
       2016-08-04 21:23:25 +08:00
    我查了一下资料, windows 提供了 net user 这个命令可以查询用户名。用 Python 可以执行系统命令,我试了一下。
    import os
    content = os.popen('net user').read()
    这样就获取到命令执行结果了,下面就可以提取你想要的信息了,说得不一定对,有错的望指正。
    lslqtz
        4
    lslqtz  
       2016-08-04 21:37:34 +08:00
    @upczww whoami ?
    C:\Users\lslqtz>whoami
    pc-win10\lslqtz
    upczww
        5
    upczww  
       2016-08-04 21:43:22 +08:00
    @lslqtz 你这个只能查自己的用户名吧
    slysly759
        6
    slysly759  
    OP
       2016-08-04 21:45:55 +08:00
    @lslqtz
    @upczww
    @infun
    @shaivas 想问一下 不论是 net user 还是 whoami 都是获取当前电脑登陆用户名对么
    另外想问一下 这种域登录是否可以用 python 实现呢
    SlipStupig
        7
    SlipStupig  
       2016-08-04 21:46:15 +08:00   ❤️ 1
    @upczww 你这个不对,你这个是本地用户,人家要拿域用户,这样可以得到域用户(有点简陋)
    import subprocess as sub
    '\n'.join(map(lambda user: user if not user.find('error') else None, sub.popen('net user /domain').read().splitlines()))

    @slysly759 你说的这些功能功能可以用 python WMI 完全实现,用 cmd 太丑陋了
    slysly759
        8
    slysly759  
    OP
       2016-08-04 21:47:01 +08:00
    @SlipStupig 太好啦 你说的这个好像真是我想要的 我这就去测试一下
    lslqtz
        9
    lslqtz  
       2016-08-04 21:54:24 +08:00
    @slysly759 net user 可以获取全部登录用户名
    whoami 只能获取当前的用户名
    域用户的话我这个不对。
    @SlipStupig 参考他的 很棒
    llajaunie
        10
    llajaunie  
       2016-08-04 22:04:49 +08:00
    试试环境变量?
    os.envrion...
    tuteng
        11
    tuteng  
       2016-08-05 09:21:13 +08:00
    ldap 登录?
    slysly759
        12
    slysly759  
    OP
       2016-08-05 09:36:59 +08:00
    @tuteng 好像是
    目前是这样 写了一个管道导入数据库程序 初步要求是获取当前域用户名 其次是登陆域 我不明白登陆域是什么鬼 像 SSH 那样登陆后操作么 可是我数据都在本地存储啊 我完全搞不懂需求....
    tuteng
        13
    tuteng  
       2016-08-05 09:54:48 +08:00   ❤️ 1
    我看你的需求里有获取域用户名,还有登录域:

    import ldap
    import time

    class Ldap(object):

    def __init__(self):
    self.server = "ldap 服务器地址"
    self.servername = "需要申请的用来登录域的名称"
    self.serverpass = "密码"
    self.handle = ldap.initialize(self.server)
    self.handle.protocol_version = ldap.VERSION3
    self.handle.simple_bind(self.servername, self.serverpass)
    self.basedn = u"OU=xx 研发中心,OU=xx,OU=xxxx,DC=xxxx,DC=xxx"
    self.usercn = None

    def searchdn(self, useremail):
    self.searchscope = ldap.SCOPE_SUBTREE
    # 这个 attr 可能要根据需要来更改
    self.attr = "userPrincipalName"
    self.retrieveattributes = None
    self.searchfilter = "(" + self.attr + "=" + useremail + ")"
    # 加入延时后测试通过,否则一直报错,怀疑中间过程太快
    time.sleep(0.1)
    ldap_result = self.handle.search(self.basedn, self.searchscope, self.searchfilter, self.retrieveattributes)
    # 配置结果获取,返回 dn ,第三个参数为超时时间的设置,超过时间返回
    result_type, result_data = self.handle.result(ldap_result, 0, 2)
    self.usercn = result_data[0][0]
    return self.usercn

    # 认证功能
    def auth(self, usercn, password):
    try:
    ldapuser = ldap.initialize(self.server)
    ldapuser.simple_bind(usercn, password)
    result_type, _ = ldapuser.result(timeout=2)
    return result_type
    except Exception, e:
    return None

    这是我根据网上的实例修改过的,用于自己项目的,可能看代码会更好理解一些。
    不知道这个能不能满足你的需求。
    SlipStupig
        14
    SlipStupig  
       2016-08-05 10:03:15 +08:00   ❤️ 1
    @slysly759 域和工作组是 windows 很重要的一个概念,工作组就是零散的分布式在局域网,默认登录就是本地域,而域却是一个集中管理.
    一般表现就是"pc-v2ex\administrator", “\”前面的就是域名,通过"net view /domain"domain 可以看到加入的域(前提是该机器已经加入了至少一个域,否则显示工作组),分为 domain cotroller 和 users (网络版本 user 和 administrator 用户),所有的账号密码会保存在 DC 里面,这样 dc 可以控制所有的机器(有账号凭据后可以通过 SMB 协议进行一切操作),关于导出用户可以参考: https://msdn.microsoft.com/en-us/library/bb727091.aspx (如果要导出所有域成员的账户需要在 DC 上操作)
    ila
        15
    ila  
       2016-08-05 12:47:36 +08:00 via Android
    用 wmi 模块?
    slysly759
        16
    slysly759  
    OP
       2016-08-05 13:40:37 +08:00
    @SlipStupig
    @tuteng
    非常感谢你们的回复,我已经知道该怎么做了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   996 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:21 · PVG 05:21 · LAX 13:21 · JFK 16:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.