我是使用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是准确的,但这不起作用仍会返回原始错误。
答案 0 :(得分: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)
答案 1 :(得分:0)
我不是百分之百确定你在使用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
)
答案 2 :(得分:-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()