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

2016-08-04 20:02:43 +08:00
 slysly759

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

8213 次点击
所在节点    Python
16 条回复
shaivas
2016-08-04 20:06:15 +08:00
获取域用户名可以通过系统命令
infun
2016-08-04 20:16:19 +08:00
os.system(cmd)
upczww
2016-08-04 21:23:25 +08:00
我查了一下资料, windows 提供了 net user 这个命令可以查询用户名。用 Python 可以执行系统命令,我试了一下。
import os
content = os.popen('net user').read()
这样就获取到命令执行结果了,下面就可以提取你想要的信息了,说得不一定对,有错的望指正。
lslqtz
2016-08-04 21:37:34 +08:00
@upczww whoami ?
C:\Users\lslqtz>whoami
pc-win10\lslqtz
upczww
2016-08-04 21:43:22 +08:00
@lslqtz 你这个只能查自己的用户名吧
slysly759
2016-08-04 21:45:55 +08:00
@lslqtz
@upczww
@infun
@shaivas 想问一下 不论是 net user 还是 whoami 都是获取当前电脑登陆用户名对么
另外想问一下 这种域登录是否可以用 python 实现呢
SlipStupig
2016-08-04 21:46:15 +08:00
@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
2016-08-04 21:47:01 +08:00
@SlipStupig 太好啦 你说的这个好像真是我想要的 我这就去测试一下
lslqtz
2016-08-04 21:54:24 +08:00
@slysly759 net user 可以获取全部登录用户名
whoami 只能获取当前的用户名
域用户的话我这个不对。
@SlipStupig 参考他的 很棒
llajaunie
2016-08-04 22:04:49 +08:00
试试环境变量?
os.envrion...
tuteng
2016-08-05 09:21:13 +08:00
ldap 登录?
slysly759
2016-08-05 09:36:59 +08:00
@tuteng 好像是
目前是这样 写了一个管道导入数据库程序 初步要求是获取当前域用户名 其次是登陆域 我不明白登陆域是什么鬼 像 SSH 那样登陆后操作么 可是我数据都在本地存储啊 我完全搞不懂需求....
tuteng
2016-08-05 09:54:48 +08:00
我看你的需求里有获取域用户名,还有登录域:

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
2016-08-05 10:03:15 +08:00
@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
2016-08-05 12:47:36 +08:00
用 wmi 模块?
slysly759
2016-08-05 13:40:37 +08:00
@SlipStupig
@tuteng
非常感谢你们的回复,我已经知道该怎么做了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/297184

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX