Python 2.7,WMI意外的COM错误-2147352567连接到域系统的非域系统

问题描述 投票:0回答:3

我是新手使用WMI;试图编写一个通过WMI连接到远程系统的应用程序。我需要这个应用程序来监视用户登录,用户注销和用户空闲时。在登录时,结束应用程序在系统上启动的进程。在注销或空闲时,我希望它重新启动服务。这样我希望最大限度地利用机器,同时不影响用户。

我有以下代码,主要是尝试使用Python WMI v1.4.9:

import wmi
import os
import threading
import getpass

class Application():
def __init__(self):
    self.getCredentials(self)
    self.getHostnames(self)
    self.makeConnection(self)
    self.runProgram(self)

def makeConnection(self, parent):
    parent.server = parent.hostlist.pop()
    print "makeConnection"
    parent.wmiConnection = wmi.WMI(parent.server, user=parent.username, password=parent.password)
    #For proof of concept, I'm settling for a single system for now.  I can write the threading later.

def runProgram(self,parent):
    print "runProgram"
    parent.wmiConnection.Win32_Process.Create(CommandLine="cmd")

def getCredentials(self, parent):
    parent.domain = raw_input('Domain: ')
    parent.username = raw_input('Username: ')
    parent.password = getpass.getpass(stream=None)

def getHostnames(self, parent):
    if os.path.exists("hosts.txt"):
        parent.hostslistfile = open("hosts.txt", "r")
        parent.hostlist = parent.hostslistfile.readlines()
        parent.hostslistfile.close()

if __name__ == "__main__":
app = Application()

我试图将凭证传递给makeConnection()。我知道服务器接受WMI查询,因为我可以运行makeConnection()而无需从连接到域的系统中指定user =和password =;结果连接成功。我尝试将用户作为域\用户传递,但无法找到有关如何更正确地执行此操作的文档。

我收到的实际错误如下:

Traceback (most recent call last):
  File "C:\Users\Urist\Dropbox\code\foreman.py", line 35, in <module>
    app = Application()
  File "C:\Users\Urist\Dropbox\code\foreman.py", line 10, in __init__
    self.makeConnection(self)
  File "C:\Users\Urist\Dropbox\code\foreman.py", line 15, in makeConnection
    parent.wmiConnection = wmi.WMI(parent.server, user=parent.username, password
=parent.password)
  File "C:\Python27\lib\site-packages\wmi.py", line 1290, in connect
    handle_com_error ()
  File "C:\Python27\lib\site-packages\wmi.py", line 241, in handle_com_error
    raise klass (com_error=err)
wmi.x_wmi: <x_wmi: Unexpected COM Error (-2147352567, 'Exception occurred.', (0,
  u'SWbemLocator', u'The RPC server is unavailable. ', None, 0, -2147023174), Non
e)>

WMI食谱中似乎有一个拼写错误。但是,在开始的WMI教程中使用引用,我可以通过执行以下操作成功创建远程连接:

connection = wmi.WMI("HOSTNAME", user=r"domain\user", password="password")

从那以后我将makeConnection()模块修改为以下内容:

def makeConnection(self, parent):
    parent.passedUsername = "r\"" + parent.username + "\""
    parent.server = parent.hostlist.pop()
    #print parent.server, parent.passedUsername
    parent.wmiConnection = wmi.WMI(parent.server, user=parent.passedUsername, password=parent.password)

不幸的是,尽管parent.passedUsername是准确的,但这不起作用并仍然返回原始错误。

python windows wmi monitoring
3个回答
1
投票

实际上并不是导致错误的凭据。相反,它是hosts.txt文件,并使用pop()从返回分隔的列表中获取主机名。如果您执行以下操作,代码将正确执行:

def makeConnection(self, parent):
    parent.server = parent.hostlist.pop().strip()
    parent.wmiConnection = wmi.WMI(computer=parent.server, user=parent.username, password=parent.password)

0
投票

我不是100%肯定你正在使用的passUsername =“r \”“片段。你看起来好像在尝试在普通字符串中表示原始字符串。暂时忘记r”域\ user“并且只是做”域\用户“ - 即如果你需要加倍反斜杠。我也不确定你是否想要将那个用户名用户写回父对象,但我假设你有这么好的理由。

IIUC你的makeConnection应该是这样的:

  def makeConnection(self, parent):
    if parent.domain:
      parent.passedUsername = "%s\\%s" % (parent.domain, parent.username)
    else:
      parent.passedUsername = parent.username
    parent.server = parent.hostlist.pop()
    parent.wmiConnection = wmi.WMI(
      parent.server, 
      user=parent.passedUsername,
      password=parent.password
    )

-1
投票

这可能是一种不同的方法,但您肯定能够连接到远程服务器。使用paramiko模块。

hostname = ""
username = ""
password = ""
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=hostname, username=username, password=password)
print("Connected to remote", hostname)
ftp = ssh.open_sftp()
<--------Your Code Here--------------->
ftp.close()
© www.soinside.com 2019 - 2024. All rights reserved.