About wmi

P

patrol

I want to prevent some process from running. The code is in the
following. I encounter some unexpected troubles.
Probelm1: This program cannot terminate "scrcons.exe" and
"FNPLicensingService.exe",which are system processes.
Problem2:After a while, this program will abort by error
File "C:\Python25\lib\wmi.py", line 397, in __call__
handle_com_error (error_info)
File "C:\Python25\lib\wmi.py", line 190, in handle_com_error raise
x_wmi, "\n".join (exception_string)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position
14: ordinal not in range(128)


----------------------------------------------------
code----------------------------------------------------------------------------------
# -*- coding:utf-8 -*-
import pythoncom
import wmi
import threading
import time
from xml.dom.minidom import parse, parseString

class Info (threading.Thread):
def __init__ (self):
threading.Thread.__init__ (self)
def run (self):
print 'In Another Thread...'
pythoncom.CoInitialize ()
dom1 = parse('processTerminateList.xml')
config_element = dom1.getElementsByTagName("processTerminateList")
[0]
servers = config_element.getElementsByTagName("processName")
try:
c = wmi.WMI ()
for process in c.Win32_Process ():
for server in servers:
if process.name == getText(server.childNodes):
process.Terminate()
print process.name
process_watcher = c.Win32_Process.watch_for("creation")
while True:
new_process = process_watcher()
name = new_process.Caption
print name
for server in servers:
if name == getText(server.childNodes):
new_process.Terminate()
finally:
pythoncom.CoUninitialize ()
def getText(nodelist):
rc = ""
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
rc = rc + node.data
return rc

if __name__ == '__main__':
Info().start()
------------------------------------------------------
processTerminateList.xml-----------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<processTerminateList>
<processName>scrcons.exe</processName>
<processName>TXPlatform.exe</processName>
<processName>mdm.exe</processName>
<processName>FNPLicensingService.exe</processName>
<processName>notepad.exe</processName>
<processName>uedit32.exe</processName>
</processTerminateList>
 
P

patrol

patrol said:
I want to prevent some process from running. The code is in the
following. I encounter some unexpected troubles.
Probelm1: This program cannot terminate "scrcons.exe" and
"FNPLicensingService.exe",which are system processes.
Problem2:After a while, this program will abort by error
File "C:\Python25\lib\wmi.py", line 397, in __call__
handle_com_error (error_info)
File "C:\Python25\lib\wmi.py", line 190, in handle_com_error raise
x_wmi, "\n".join (exception_string)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position
14: ordinal not in range(128)
----------------------------------------------------
code-----------------------------------------------------------------------------------
# -*- coding:utf-8 -*-
import pythoncom
import wmi
import threading
import time
from xml.dom.minidom import parse, parseString
class Info (threading.Thread):
def __init__ (self):
threading.Thread.__init__ (self)
def run (self):
print 'In Another Thread...'
pythoncom.CoInitialize ()
dom1 = parse('processTerminateList.xml')
config_element = dom1.getElementsByTagName("processTerminateList")
[0]
servers = config_element.getElementsByTagName("processName")
try:
c = wmi.WMI ()
for process in c.Win32_Process ():
for server in servers:
if process.name == getText(server.childNodes):
process.Terminate()
print process.name
process_watcher = c.Win32_Process.watch_for("creation")
while True:
new_process = process_watcher()
name = new_process.Caption
print name
for server in servers:
if name == getText(server.childNodes):
new_process.Terminate()
finally:
pythoncom.CoUninitialize ()
def getText(nodelist):
rc = ""
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
rc = rc + node.data
return rc
if __name__ == '__main__':
Info().start()
------------------------------------------------------
processTerminateList.xml------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<processTerminateList>
<processName>scrcons.exe</processName>
<processName>TXPlatform.exe</processName>
<processName>mdm.exe</processName>
<processName>FNPLicensingService.exe</processName>
<processName>notepad.exe</processName>
<processName>uedit32.exe</processName>
</processTerminateList>

You should probably post this to comp.python.windows. Tim Golden (author of WMI
interface) monitors that list religously (thanks Tim).

-Larry- Òþ²Ø±»ÒýÓÃÎÄ×Ö -

- ÏÔʾÒýÓõÄÎÄ×Ö -

I cannot find comp.python.windows.What's the URL?
 
P

patrol

patrol said:
patrol wrote:
I want to prevent some process from running. The code is in the
following. I encounter some unexpected troubles.
Probelm1: This program cannot terminate "scrcons.exe" and
"FNPLicensingService.exe",which are system processes.
Problem2:After a while, this program will abort by error
File "C:\Python25\lib\wmi.py", line 397, in __call__
handle_com_error (error_info)
File "C:\Python25\lib\wmi.py", line 190, in handle_com_error raise
x_wmi, "\n".join (exception_string)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position
14: ordinal not in range(128)
----------------------------------------------------
code------------------------------------------------------------------------------------
# -*- coding:utf-8 -*-
import pythoncom
import wmi
import threading
import time
from xml.dom.minidom import parse, parseString
class Info (threading.Thread):
def __init__ (self):
threading.Thread.__init__ (self)
def run (self):
print 'In Another Thread...'
pythoncom.CoInitialize ()
dom1 = parse('processTerminateList.xml')
config_element = dom1.getElementsByTagName("processTerminateList")
[0]
servers = config_element.getElementsByTagName("processName")
try:
c = wmi.WMI ()
for process in c.Win32_Process ():
for server in servers:
if process.name == getText(server.childNodes):
process.Terminate()
print process.name
process_watcher = c.Win32_Process.watch_for("creation")
while True:
new_process = process_watcher()
name = new_process.Caption
print name
for server in servers:
if name == getText(server.childNodes):
new_process.Terminate()
finally:
pythoncom.CoUninitialize ()
def getText(nodelist):
rc = ""
for node in nodelist:
if node.nodeType == node.TEXT_NODE:
rc = rc + node.data
return rc
if __name__ == '__main__':
Info().start()
------------------------------------------------------
processTerminateList.xml-------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<processTerminateList>
<processName>scrcons.exe</processName>
<processName>TXPlatform.exe</processName>
<processName>mdm.exe</processName>
<processName>FNPLicensingService.exe</processName>
<processName>notepad.exe</processName>
<processName>uedit32.exe</processName>
</processTerminateList>
You should probably post this to comp.python.windows. Tim Golden (author of WMI
interface) monitors that list religously (thanks Tim).
-Larry- Òþ²Ø±»ÒýÓÃÎÄ×Ö -
- ÏÔʾÒýÓõÄÎÄ×Ö -
I cannot find comp.python.windows.What's the URL?

http://news.gmane.org/gmane.comp.python.windows/cutoff=7565

-Larry- Òþ²Ø±»ÒýÓÃÎÄ×Ö -

- ÏÔʾÒýÓõÄÎÄ×Ö -

Thanks
 
T

Tim Golden

[... snip code ...]
You should probably post this to comp.python.windows. Tim Golden
(author of WMI interface) monitors that list religously (thanks Tim).


Actually, I follow this one pretty much, too. I've just been a bit busy
these last few days. And still am, so this answer will be short :)


1) I'm not sure if WMI can be forced to close down system processes,
but if it can it's probably by means of specifying one or more
privileges when you connect. Try looking in the WMI newsgroups
for a more general (non-Python) answer to this and I'll happily
explain how to apply it in a Python context.

2) I can't quite see from this traceback where the problem
arises. Have you snipped the traceback at all, or was that
all there was? Can you narrow the thing down to a short
snippet of code which I'm likely to be able to run independently,
please?

Sorry for the haste.

TJG
 
P

patrol

Hi,
1) I'm not sure if WMI can be forced to close down system processes,
but if it can it's probably by means of specifying one or more
privileges when you connect. Try looking in the WMI newsgroups
for a more general (non-Python) answer to this and I'll happily
explain how to apply it in a Python context.
I use VBS to kill these processes,the VBS cannot kill these either.
2) I can't quite see from this traceback where the problem
arises. Have you snipped the traceback at all, or was that
all there was? Can you narrow the thing down to a short
snippet of code which I'm likely to be able to run independently,
please?
import wmi
from time import sleep

c = wmi.WMI ()
process_watcher = c.Win32_Process.watch_for("creation")
while True:
new_process = process_watcher()
if new_process.Caption == 'notepad.exe':
print "start killing.."
sleep(5)
result = new_process.terminate()
print "killed"
We must start the notepad.exe manually, then (1) kill the notepad.exe
by this code.
(2)we kill the notepad.exe before this code manually. Both will result
in errors.
 
P

patrol

Situation (1):
result = new_process.terminate()
TypeError: 'int' object is not callable

Situation (2):
result = new_process.terminate()
File "C:\Python25\lib\wmi.py", line 494, in __getattr__
handle_com_error (error_info)
File "C:\Python25\lib\wmi.py", line 190, in handle_com_error
raise x_wmi, "\n".join (exception_string)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position
14: ordinal
not in range(128)

BTW, My windows' languange is Chinese.
 
T

Tim Golden

patrol said:
Situation (2):
result = new_process.terminate()
File "C:\Python25\lib\wmi.py", line 494, in __getattr__
handle_com_error (error_info)
File "C:\Python25\lib\wmi.py", line 190, in handle_com_error
raise x_wmi, "\n".join (exception_string)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position
14: ordinal
not in range(128)

BTW, My windows' languange is Chinese.


Well that looks embarrassingly like a complete lack
of unicode-awareness in the wmi module. Would you
mind trying this version:

http://timgolden.me.uk/wmi-project/wmi.py

which is a copy of the svn trunk to see if that
improves the UnicodeDecode error, please? I'll
try to get an install of a non-English edition of
Windows but, as you might imagine, I normally run
the UK version so don't hit these kind of issue
myself.

TJG
 
T

Tim Golden

patrol said:
Situation (1):
result = new_process.terminate()
TypeError: 'int' object is not callable

I'm not sure exactly what's causing that
particular effect, but I would suggest that
you call the method as .Terminate (note the
initial capital). On my box, calling .terminate
simply raises an AttributeError as expected,
but I do remember encountering the situation
you're describing in some situation which
now escapes me.

At any rate, try using:

result, = new_process.Terminate ()

and note that the return value is a tuple,
not a single number. The code will work either
way, but in your case "result" will be a tuple
of length one; in mine, result will be a number.

TJG
 
P

patrol

http://timgolden.me.uk/wmi-project/wmi.py

It cannot work either.
which is a copy of the svn trunk to see if that
improves the UnicodeDecode error, please? I'll
try to get an install of a non-English edition of
Windows but, as you might imagine, I normally run
the UK version so don't hit these kind of issue
myself.

I expect you can test successfully at a non-English edition
 
P

patrol

At any rate, try using:

result, = new_process.Terminate ()

Windows is sometime case insensitive,but the python is case sensitive.
I also encountered this kind of problems.

Thanks for Tim's help.

Patrol
 
T

Tim Golden

patrol said:
It cannot work either.

Oh well. It was only a quick fix! I'll try
to get some kind of non-ASCII edition of Windows
to test against. As I understand it, the situation
is that some WMI exception (ie coming from the
underlying WMI/COM subsystem) results in an error
message which contains non-ASCII characters.

Just so I'm not chasing red herrings, could you
paste the output from the following code, please?

<code>
import wmi # use the version linked above

c = wmi.WMI ("non-existent computer")

#
# Should give a traceback here for the DCOM
# error, not a UnicodeDecodeError.
#
</code>

Thanks

TJG
 
P

patrol

Oh well. It was only a quick fix! I'll try
to get some kind of non-ASCII edition of Windows
to test against. As I understand it, the situation
is that some WMI exception (ie coming from the
underlying WMI/COM subsystem) results in an error
message which contains non-ASCII characters.

Just so I'm not chasing red herrings, could you
paste the output from the following code, please?

<code>
import wmi # use the version linked above

c = wmi.WMI ("non-existent computer")

#
# Should give a traceback here for the DCOM
# error, not a UnicodeDecodeError.
#
</code>

Thanks

TJG
The errors are in the following:

Traceback (most recent call last):
File "D:\My Documents\code\python\wmi\test.py", line 5, in <module>
c = wmi.WMI ("non-existent computer")
File "C:\Python25\lib\wmi.py", line 1199, in connect
handle_com_error (error_info)
File "C:\Python25\lib\wmi.py", line 184, in handle_com_error
exception_string = [u"%s - %s" % (hex (hresult_code),
hresult_name)]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position
4: ordinal not in range(128)

Patrol
 
T

Tim Golden

patrol said:
The errors are in the following:

Traceback (most recent call last):
File "D:\My Documents\code\python\wmi\test.py", line 5, in <module>
c = wmi.WMI ("non-existent computer")
File "C:\Python25\lib\wmi.py", line 1199, in connect
handle_com_error (error_info)
File "C:\Python25\lib\wmi.py", line 184, in handle_com_error
exception_string = [u"%s - %s" % (hex (hresult_code),
hresult_name)]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position
4: ordinal not in range(128)

OK, I'm trying to set up a Virtual PC so I can install
a non-English XP. But would you mind running the
following code for me, please, so I can get a handle
on what's coming back:

<code>
import pythoncom
import win32com.client

try:
win32com.client.GetObject ("winmgmts://blahblah")
except pythoncom.com_error, info:
for i in info:
print repr (i)

</code>

Thanks
TJG
 
P

patrol

patrol said:
The errors are in the following:
Traceback (most recent call last):
File "D:\My Documents\code\python\wmi\test.py", line 5, in <module>
c = wmi.WMI ("non-existent computer")
File "C:\Python25\lib\wmi.py", line 1199, in connect
handle_com_error (error_info)
File "C:\Python25\lib\wmi.py", line 184, in handle_com_error
exception_string = [u"%s - %s" % (hex (hresult_code),
hresult_name)]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position
4: ordinal not in range(128)

OK, I'm trying to set up a Virtual PC so I can install
a non-English XP. But would you mind running the
following code for me, please, so I can get a handle
on what's coming back:

<code>
import pythoncom
import win32com.client

try:
win32com.client.GetObject ("winmgmts://blahblah")
except pythoncom.com_error, info:
for i in info:
print repr (i)

</code>

Thanks
TJG

-2147023174
'RPC \xb7\xfe\xce\xf1\xc6\xf7\xb2\xbb\xbf\xc9\xd3\xc3\xa1\xa3'
None
None

----------------------------------------------------------------------
import pythoncom
import win32com.client


try:
win32com.client.GetObject ("winmgmts://blahblah")
except pythoncom.com_error, info:
for i in info:
print i

-2147023174
RPC ·þÎñÆ÷²»¿ÉÓá£
None
None
-------------------------------------------------------------------------
 
T

Tim Golden

patrol said:
-2147023174
'RPC \xb7\xfe\xce\xf1\xc6\xf7\xb2\xbb\xbf\xc9\xd3\xc3\xa1\xa3'
None
None

----------------------------------------------------------------------
import pythoncom
import win32com.client


try:
win32com.client.GetObject ("winmgmts://blahblah")
except pythoncom.com_error, info:
for i in info:
print i

-2147023174
RPC ·þÎñÆ÷²»¿ÉÓá£
None
None

Brilliant. Thanks, Patrol. So the error message comes back
encoded. Can you confirm what your console encoding is,
please? The following script should confirm:

<code>
import os, sys

print sys.stdout.encoding
os.system ("chcp")

</code>

TJG
 
T

Tim Golden

Assuming that the error comes back in the sys.stdout encoding, the following version *should* work ok. I still haven't got a non-English set up to test it on, but it certainly does return a Unicode error message.

http://timgolden.me.uk/wmi-project/wmi.py

The usual test case, if you wouldn't mind:

<code>
import wmi

wmi.WMI ("non-existent computer")

</code>

should give a (language-specific) error message, not an UnicodeDecodeError

TJG
 
P

patrol

patrol said:
-2147023174
'RPC \xb7\xfe\xce\xf1\xc6\xf7\xb2\xbb\xbf\xc9\xd3\xc3\xa1\xa3'
None
None
try:
win32com.client.GetObject ("winmgmts://blahblah")
except pythoncom.com_error, info:
for i in info:
print i
-2147023174
RPC ·þÎñÆ÷²»¿ÉÓá£
None
None

Brilliant. Thanks, Patrol. So the error message comes back
encoded. Can you confirm what your console encoding is,
please? The following script should confirm:

<code>
import os, sys

print sys.stdout.encoding
os.system ("chcp")

</code>

TJG- Òþ²Ø±»ÒýÓÃÎÄ×Ö -

- ÏÔʾÒýÓõÄÎÄ×Ö -
»î¶¯µÄ´úÂëÒ³: 936
0'ascii'
 
P

patrol

Assuming that the error comes back in the sys.stdout encoding, the following version *should* work ok. I still haven't got a non-English set up to test it on, but it certainly does return a Unicode error message.

http://timgolden.me.uk/wmi-project/wmi.py

The usual test case, if you wouldn't mind:

<code>
import wmi

wmi.WMI ("non-existent computer")

</code>

should give a (language-specific) error message, not an UnicodeDecodeError

TJG --------------------------------------------------------------------------------------
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python25\lib\wmi.py", line 1199, in connect
handle_com_error (error_info)
File "C:\Python25\lib\wmi.py", line 184, in handle_com_error
exception_string = [u"%s - %s" % (hex (hresult_code),
hresult_name)]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position
4: ordinal
not in range(128)
--------------------------------------------------------------------------------------
yup,error_info contains the Chinese encoded string. All of the Simple
Chinese Windows use the CP936.Every Chinese word utilizes two
bytes.Maybe you can fix this bug by modifying handle_com_error.

Patrol
 
T

Tim Golden

patrol said:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python25\lib\wmi.py", line 1199, in connect
handle_com_error (error_info)
File "C:\Python25\lib\wmi.py", line 184, in handle_com_error
exception_string = [u"%s - %s" % (hex (hresult_code),
hresult_name)]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position
4: ordinal
not in range(128)


Well, that's what I've done in that latest version.
Only I naively assumed
that I could use sys.stdout.encoding to determine
the encoding. I'll have to try harder.

TJG
 
T

Tim Golden

patrol said:
Assuming that the error comes back in the sys.stdout encoding, the following version *should* work ok. I still haven't got a non-English set up to test it on, but it certainly does return a Unicode error message.

http://timgolden.me.uk/wmi-project/wmi.py

The usual test case, if you wouldn't mind:

<code>
import wmi

wmi.WMI ("non-existent computer")

</code>

should give a (language-specific) error message, not an UnicodeDecodeError

TJG --------------------------------------------------------------------------------------
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python25\lib\wmi.py", line 1199, in connect
handle_com_error (error_info)
File "C:\Python25\lib\wmi.py", line 184, in handle_com_error
exception_string = [u"%s - %s" % (hex (hresult_code),
hresult_name)]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position
4: ordinal
not in range(128)

Can you confirm that that last bit of
code was run with the version of wmi.py
currently at:

http://timgolden.me.uk/wmi-project/wmi.py

That version should already be decoding the
string correctly.

TJG
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,008
Latest member
HaroldDark

Latest Threads

Top