Python 2.7, неожиданная ошибка COM в WMI -2147352567 Недоменная система, подключающаяся к доменной системе - PullRequest
0 голосов
/ 23 марта 2012

Я новичок в использовании 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()

IЯ застрял, пытаясь передать учетные данные в 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.

Ответы [ 3 ]

1 голос
/ 24 марта 2012

Это не были учетные данные, которые вызывали ошибку.Вместо этого это был файл 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 голосов
/ 23 апреля 2019

это может быть другой метод, но вы наверняка сможете подключиться к удаленному серверу.Используйте модуль 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()
0 голосов
/ 24 марта 2012

Я не уверен на 100%, что вы делаете с частью passUsername = "r \" ". Похоже, вы пытаетесь представить необработанную строку в обычной строке. На данный момент забудьте о r "домен \ пользователь" и просто сделайте "домен \ пользователь" - т.е. удвойте обратную косую черту, если вам нужно. Я также не уверен, хотите ли вы записать это ложное имя пользователя обратно в родительский объект, но я ' Я полагаю, у вас есть веская причина для этого.

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
    )
...