急!求助 Python 获取 windows 域用户名的方法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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

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

  •  
  •   slysly759 Aug 4, 2016 8859 views
    This topic created in 3555 days ago, the information mentioned may be changed or developed.

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

    16 replies    2016-08-05 13:40:37 +08:00
    shaivas
        1
    shaivas  
       Aug 4, 2016 via Android
    获取域用户名可以通过系统命令
    GlobalNPC
        2
    GlobalNPC  
       Aug 4, 2016
    os.system(cmd)
    upczww
        3
    upczww  
       Aug 4, 2016
    我查了一下资料, windows 提供了 net user 这个命令可以查询用户名。用 Python 可以执行系统命令,我试了一下。
    import os
    cOntent= os.popen('net user').read()
    这样就获取到命令执行结果了,下面就可以提取你想要的信息了,说得不一定对,有错的望指正。
    lslqtz
        4
    lslqtz  
       Aug 4, 2016
    @upczww whoami ?
    C:\Users\lslqtz>whoami
    pc-win10\lslqtz
    upczww
        5
    upczww  
       Aug 4, 2016
    @lslqtz 你这个只能查自己的用户名吧
    slysly759
        6
    slysly759  
    OP
       Aug 4, 2016
    @lslqtz
    @upczww
    @infun
    @shaivas 想问一下 不论是 net user 还是 whoami 都是获取当前电脑登陆用户名对么
    另外想问一下 这种域登录是否可以用 python 实现呢
    SlipStupig
        7
    SlipStupig  
       Aug 4, 2016   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
       Aug 4, 2016
    @SlipStupig 太好啦 你说的这个好像真是我想要的 我这就去测试一下
    lslqtz
        9
    lslqtz  
       Aug 4, 2016
    @slysly759 net user 可以获取全部登录用户名
    whoami 只能获取当前的用户名
    域用户的话我这个不对。
    @SlipStupig 参考他的 很棒
    llajaunie
        10
    llajaunie  
       Aug 4, 2016
    试试环境变量?
    os.envrion...
    tuteng
        11
    tuteng  
       Aug 5, 2016
    ldap 登录?
    slysly759
        12
    slysly759  
    OP
       Aug 5, 2016
    @tuteng 好像是
    目前是这样 写了一个管道导入数据库程序 初步要求是获取当前域用户名 其次是登陆域 我不明白登陆域是什么鬼 像 SSH 那样登陆后操作么 可是我数据都在本地存储啊 我完全搞不懂需求....
    tuteng
        13
    tuteng  
       Aug 5, 2016   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  
       Aug 5, 2016   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  
       Aug 5, 2016 via Android
    用 wmi 模块?
    slysly759
        16
    slysly759  
    OP
       Aug 5, 2016
    @SlipStupig
    @tuteng
    非常感谢你们的回复,我已经知道该怎么做了。
    About     Help     Advertise     Blog     API     FAQ     Solana     1208 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 23:22 PVG 07:22 LAX 16:22 JFK 19:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86