2011-11-26 152 views
2

在此先感謝您的幫助。我正在嘗試使用win32com模塊設置網絡接口的IP地址,但無法這樣做。我嘗試了很多搜索,但無法爲這個問題找到答案。這裏是我運行代碼: import win32com.client從WMI com對象調用Win32_NetworkAdapterConfiguration例程

obj = win32com.client.Dispatch("WbemScripting.SWbemLocator")

wmobj = obj.ConnectServer("localhost","root\cimv2")

nobj = wmobj.ExecQuery("Select * from Win32_NetworkAdapterConfiguration")

for n in nobj:

print n.Caption 

n.SetMTU('9000') 

當我運行這段代碼就出現了錯誤有以下錯誤:

回溯(最近通話最後一個): 文件「」,3號線,在 ñ。 SetMTU('9000') 文件「C:\ Python27 \ lib \ site-packages \ win32com \ client \ dynamic.py」,行505,在getattr ret = self。 (0,u'SWbemObjectEx',u'無效方法',無,0,-2147217362)調用,無)

我做了一些更多的調試,發現我可以訪問Win32Networking類的任何變量,但每當我嘗試調用該類的任何方法時,它都會返回這個相同的錯誤。

+0

我試過用Tim的黃金WMI模塊也結束了相同的錯誤。可能缺少一些基本常見的東西。以下是我用WMI模塊嘗試的代碼。進口WMI netobj = wmi.WMI()Win32_NetworkAdapterConfiguration的(IPEnabled = TRUE) 用於在netobj: 打印a.caption 打印a.MACAddress 打印a.mtu 打印a.ipaddress a.setipaddress( '' ) – Rohit

回答

2

我沒有太多的經驗使用win32com,但可能SetMTU方法沒有實現。根據Win32_NetworkAdapterConfiguration class的MSDN文檔,該方法「不受支持」。它在XP中失敗了。

注意與win32com,只需訪問一個屬性可以調用它:

>>> import win32com.client 
>>> wmobj = obj.ConnectServer("localhost","root\cimv2") 
>>> nobj = wmobj.ExecQuery("Select * from Win32_NetworkAdapterConfiguration") 
>>> n = nobj[10] #my wireless interface 
>>> n.ReleaseDHCPLease #invoked 
0 
>>> n.RenewDHCPLease 
0 

試圖通常稱之爲最終會試圖調用整數返回值,這引起了TypeError。但是,你可以先包裝這樣的方法,使之成爲普通的Python電話:

>>> n._FlagAsMethod('ReleaseDHCPLease') 
>>> n._FlagAsMethod('RenewDHCPLease') 
>>> n.ReleaseDHCPLease() 
0 
>>> n.RenewDHCPLease() 
0 

編輯:

在上面的鏈接頁面的用戶貢獻區域,搜索的靜態列表方法,必須從該類訪問,包括SetMTU。以下是如何獲得課程:

>>> NetAdapterConfig = wmobj.Get("Win32_NetworkAdapterConfiguration") 
>>> NetAdapterConfig._FlagAsMethod('SetMTU') 

請參閱the docs瞭解返回值的含義。儘管我不太瞭解這種方法在靜態環境中的作用。


下面是一個使用標準庫的winreg更新註冊表的一個例子:

import winreg 

nid = n.SettingID 
MTU = 1500 

path = r'SYSTEM\CurrentControlSet\Services\TCPIP\Parameters\Interfaces\\'+ nid 
sam = winreg.KEY_ALL_ACCESS 
adapter = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path, 0, sam) 
winreg.SetValueEx(adapter, 'MTU', None, winreg.REG_DWORD, MTU) 
+0

仍然出現以下錯誤:>>> n._FlagAsMethod('EnableStatic')>>> n.EnableStatic('10 .193.184.215','255.255.255.0') Traceback(最近一次調用最後一次): File 「」,第1行,在 n.EnableStatic('10 .193.184.215','255.255.255.0') 文件「>」,第2行,在EnableStatic中 com _error:(-2147352567,'發生異常',(0,u'SWbemObjectEx',u'Type mismatch',None,0,-2147217403),None) – Rohit

+1

@Rohit:'EnableStatic'需要數組。你可以使用元組或列表。試試'n.EnableStatic(['10.193.184.215'],['255.255.255.0'])'。 – eryksun

+0

它工作:)。謝謝你的幫助真的很感謝。 – Rohit

0

好吧,我只是嘗試了FlagAsMethod

的建議,對於Win32_Process類,例如:

proc10 = GetObject(pos).ExecQuery("Select * from Win32_Process")[10] 
proc10._FlagAsMethod('GetOwner') 
proc10.GetOwner() 
# >> 0 

但是,我我期待domain\user等。此外,我也可以寫

proc10.GetOwner(10,20,30) 

但效果是一樣的。

我貼了here一個方法在我的情況下工作。我只是想知道SetMTU是否使用_FlagAsMethod提示獲得了正確的值。

1

我遇到了類似的問題,並找到一種方法來調用Win32_NetworkAdapterConfiguration對象的這些方法。這裏我沒有直接使用這些方法,而是將所有輸入參數包含到SpawnInstance_中。它似乎有線但工作。

import win32com.client 
objLocator = win32com.client.Dispatch("WbemScripting.SWbemLocator") 
objService = objLocator.ConnectServer(".","root\cimv2") 
nobj = objService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled = True") 
obj = nobj[0] 

## here is the strange part. 
obj_method = obj.Methods_("SetWINSServer") 
obj_in_param = obj_method.inParameters.SpawnInstance_() 
obj_in_param.WINSPrimaryServer = "127.0.0.1" 
obj_in_param.WINSSecondaryServer = "127.0.0.2" 
#invoke the SetWINServer method, and it worked. 
obj.ExecMethod_("SetWINSServer", obj_in_param) 

幾乎所有Win32_NetworkAdapterConfiguration的這些方法都可以像這樣使用。 但是,「SetMTU」不能,也許是因爲「這種方法不支持」,我在Windows 2008R2中嘗試它,但得到相同的錯誤。 它說這裏SetMTU不支持。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa393463(v=vs.85).aspx