使用 pywin32 的便携式 Python com 服务器 [英] Portable Python com server using pywin32
问题描述
是否可以在不需要提升的情况下运行 comserver.
Is it possible to run comserver without requiring elevation.
例如,我可以从 Python.TestServer(如下)运行代码,但它需要提升.
For example I am able to run code from Python.TestServer (below) but it requires elevation.
Python.TestServer 代码位于:从 .NET 使用 Python COM 服务器
Python.TestServer code is at: Consuming Python COM Server from .NET
是否可以运行不需要提升的 com 服务器,以便我可以在没有管理密码的情况下运行 com 对象.
Is it possible to run com server which doesn't require elevation so that I can run com object without having Administrative password.
例如
import pythoncom
from win32com.server import localserver
class demoObj(object):
_reg_clsctx_ = pythoncom.CLSCTX_LOCAL_SERVER
_reg_clsid_ = "{FA501660-8BB0-42F6-842B-A757FA3098DC}"
_reg_desc_ = "Demo COM server"
_reg_progid_ = "Python.Demo"
_public_methods_ = ['hello']
def hello(self, who):
return "Hellow " + who
localserver.serve('B83DD222-7750-413D-A9AD-01B37021B24B')
我已经尝试过上面的代码,但它说 pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)
I have tried above code but it says pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)
如何为本地服务器生成有效的类字符串?
how to make the valid class string for local server?
示例 vba :
Sub demodemo()
Set obj = CreateObject("Python.Demo")
Debug.Print obj.Hello("World")
End Sub
推荐答案
可以在没有权限的情况下注册和使用类.该类必须在当前用户而不是所有用户中注册.未提供该选项,因此您必须通过在 HKCU\SOFTWARE\Classes
中编写密钥来自行注册.
It's possible to register and use a class without privileges. The class has to be registered in the current user instead of all users.
The option is not provided, so you'll have to register it yourself by writing the keys in HKCU\SOFTWARE\Classes
.
这是一个工作示例:
import os, sys, win32api, win32con, win32com.server.register
class HelloWorld(object):
_reg_progid_ = "Python.TestServer"
_reg_clsid_ = "{7CC9F362-486D-11D1-BB48-0000E838A65F}"
_reg_desc_ = "Python Test COM Server"
_public_methods_ = ['Hello']
def Hello(self):
return "Hello!"
def RegisterClass(cls):
file = os.path.abspath(sys.modules[cls.__module__].__file__)
folder = os.path.dirname(file)
module = os.path.splitext(os.path.basename(file))[0]
python = win32com.server.register._find_localserver_exe(1)
python = win32api.GetShortPathName(python)
server = win32com.server.register._find_localserver_module()
command = '%s "%s" %s' % (python, server, cls._reg_clsid_)
typename = module + "." + cls.__name__
def write(path, value):
win32api.RegSetValue(win32con.HKEY_CURRENT_USER, path, win32con.REG_SZ, value)
write("SOFTWARE\\Classes\\" + cls._reg_progid_ + '\\CLSID', cls._reg_clsid_)
write("SOFTWARE\\Classes\\AppID\\" + cls._reg_clsid_, cls._reg_progid_)
write("SOFTWARE\\Classes\\CLSID\\" + cls._reg_clsid_, cls._reg_desc_)
write("SOFTWARE\\Classes\\CLSID\\" + cls._reg_clsid_ + '\\LocalServer32', command)
write("SOFTWARE\\Classes\\CLSID\\" + cls._reg_clsid_ + '\\ProgID', cls._reg_progid_)
write("SOFTWARE\\Classes\\CLSID\\" + cls._reg_clsid_ + '\\PythonCOMPath', folder)
write("SOFTWARE\\Classes\\CLSID\\" + cls._reg_clsid_ + '\\PythonCOM', typename)
write("SOFTWARE\\Classes\\CLSID\\" + cls._reg_clsid_ + '\\Debugging', "0")
print("Registered %s" % cls.__name__)
if __name__ == '__main__':
RegisterClass(HelloWorld)
这篇关于使用 pywin32 的便携式 Python com 服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!