我尝试迭代项目列表并使用列表中的每个项目执行subprocess.check_output
命令。然后我使用一些列表推导来过滤输出,最后使用set(list)
来删除重复项。我现在正在尝试返回set(list)
,但它会一直返回[]
。任何人都可以解释这是什么问题吗?
def local_file(domain, user_list, debug):
"""function iterates list of target users locally"""
if debug == True:
print "Local search based on user-file."
else:
pass
print "Targeted Users Found On LocalHost\n"
for userl in user_list:
try:
out = subprocess.check_output(["tasklist", "/V", "/FO", "List", "/FI", "USERNAME eq {0}\{1}" .format(domain, userl)], stderr=subprocess.STDOUT)
users = [item for item in out.split() if domain in item and userl in item]
sorted_list = set(users)
for item in sorted_list:
print item
except CalledProcessError as e:
errormessage = e.output
print errormessage
print "\nCompleted"
return sorted_list
答案 0 :(得分:1)
您只是return
最后一个sorted_list集,它必须是user_list末尾的空集。
基本上就是这样:
def f():
for i in range(10):
var = i
return var
print f()
>>> 9
您应该将您的sorted_list .append()
添加到新列表中并在函数末尾返回以获取所有内容:
def f():
varList = []
for i in range(10):
var = i
varList.append(var)
return varList
print f()
答案 1 :(得分:0)
当别人回答你的主要问题,覆盖循环中的变量时,我已经重写了这个,所以它只调用'tasklist'一次并解析输出,而不是一遍又一遍地为user_list中的每个用户调用它: / p>
import subprocess
import csv
user_list = ['Test']
domain='MyPC'
tasklist = subprocess.check_output("tasklist /V /FO CSV")
tasks = csv.DictReader(tasklist.splitlines(), dialect="excel")
users = set()
for task in tasks:
if task['User Name'] == 'N/A': continue
task_domain, task_user = task['User Name'].split('\\')
if domain == task_domain and task_user in user_list:
users.add(task_user)
print '\n'.join(users)
# return users
(考虑SysInternals' PsLoggedOn哪些查询通过注册表快速登录用户,并且也可以针对远程计算机运行。