Python版本:3.7
操作系统:Server 2008 r2-充当AD服务器
我正在运行python脚本,使用以下代码通过cmd进行 dsquery 查找:
import subprocess
instruction = "dsquery user domainroot -samid 18129"
output = subprocess.run(instruction, stdout=subprocess.PIPE, shell=True)
然后得到我运行的结果:
result = str(output.stdout.decode('ISO-8859-1'))
或
result = str(output.stdout.decode('utf-8'))
我都尝试过。一般来说,这很不错,我没有问题。我通常会得到类似
的结果"CN=Joe Soap,OU=Students,dc=khs,dc=edu"
但是在我的网络中,少数情况下用户的名字有不寻常的字符,例如é或ë,我遇到了错误。假设名字为JoéSoap
使用UTF-8解码时,我得到
"CN=Jo\x82 Soap,OU=Students,dc=khs,dc=edu"
通过ISO-8859-1,我得到了
"CN=Jo? Soap,OU=Students,dc=khs,dc=edu"
最后,如果我直接运行cmd命令,我将得到正确的响应:
"CN=Joé Soap,OU=Students,dc=khs,dc=edu"
我在这里想念什么?除了上面提到的两种编码之外,我是否还应该使用一种特定的编码(我已经尝试了其他几种编码而没有成功)还是在这里的过程中缺少某些东西?
答案 0 :(得分:0)
我认为这更多是一种解决方法,但是为什么不使用Popen而不是run?
def start_process(command=''):
return subprocess.Popen(command.split(' '), stdout=subprocess.PIPE, shell=False, creationflags = 0x08000000)
command = start_process('string that you would normally put in cmd window')
result_string = str(command.communicate()[0])
缠绕较长时间,但最终可能更易于使用
答案 1 :(得分:0)
由于@lit和@vencaslac的评论,我找到了答案:
result = str(output.stdout.decode('CP437'))
CP437是cmd使用的编码,当应用于我的脚本时,它将成功返回é或任何