我正在尝试设置一个没有管理员权限的COM服务器,因此我可以运行一个与Python解释器通信的Word加载项。当我在本地服务器上运行IPictureDisp对象给python时,会出现问题。
将外接程序注册为InProcServer32是可以的,但是我发现将外接程序注册为InProcServer的代码需要提升权限(管理员权限)。由于我需要此程序才能在没有管理员权限的情况下运行,因此我使用以下解决方案将COM作为localserver运行。
def RegisterClass(cls):
file = 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")
但是,当运行本地服务器而不是为IPictureDisp对象获取COM对象时,我从Word中收到一条消息,提示“自动化错误:灾难性故障”。
是否可以仅以当前用户身份(无管理员)运行InProcServer或使IPictureDisp对象在LocalServer32上工作?