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