当前位置: 首页 > 面试题库 >

使用pywin32的便携式Python com服务器

陆文康
2023-03-14
问题内容

是否可以运行comserver而无需提升权限。

例如,我能够从Python.TestServer(如下)运行代码,但它需要提升。

Python.TestServer代码位于:从.NET消耗Python COM
Server

是否可以运行不需要提升的com服务器,以便我可以在没有管理密码的情况下运行com对象。

例如

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)

如何使本地服务器的有效类字符串?

示例vba:

Sub demodemo()
    Set obj = CreateObject("Python.Demo")
    Debug.Print obj.Hello("World")
End Sub

问题答案:

可以注册和使用没有特权的类。该类必须在当前用户而非所有用户中注册。该选项未提供,因此您必须通过在中写入密钥来自己注册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)


 类似资料:
  • 本文向大家介绍sed便携使用,包括了sed便携使用的使用技巧和注意事项,需要的朋友参考一下 示例 就地编辑虽然很常见,但却是一种非标准功能。一个可行的替代方法是使用中间文件来存储原始文件或输出。 要将-i选项与GNU和FreeBSD语法一起使用,必须指定扩展名并将其附加到-i选项中。两者都将接受以下内容,并产生两个文件:的原始版本file.orig和的编辑版本file: 请参阅给定文件的基本示例f

  • 我正在尝试使用java applet访问windows 7中显示为便携式设备的设备中的一些文件(其中包含“windows CE”应用程序)。。。。 我的设备路径是 同样我用了 当我导航到已连接的设备并右键单击文件并查看其属性时,它会将其位置显示为 此外,当我打开此文件时,它会自动放在我电脑的临时文件中。我也在使用签名小程序,所以不存在文件访问被拒绝的问题 我也用过

  • 是否有一种可移植的方法来实现C/C中的标记指针,比如一些跨平台和编译器工作的有文档记录的宏?或者,当你标记你的指针时,你就有危险了?如果存在这样的助手函数/宏,它们是任何标准的一部分还是仅作为开源库提供? 对于那些不知道标记指针是什么但感兴趣的人来说,这是一种在普通指针中存储一些额外数据的方法,因为在大多数体系结构中,指针中的某些位总是0或1,所以您将标记/类型/提示保留在这些额外位中,在你们想用

  • 我正在运行一个示例管道,我的环境就是这样。 Python"SaiResearch-Apache-Beam-Spark.py"--run=PortableRunner--job_endpoint=192.168.99.102:8099 我的Spark运行在Docker容器上,我可以看到JobService运行在8099。 我得到以下错误:grpc_频道_多线程登录: 当我卷曲到ip: port时,我

  • 可移植性是任何编程语言的重要方面。 众所周知,Rexx可用于各种操作系统,如Windows和Linux。 因此,需要确保在Windows平台上开发程序时,如果在Linux平台上运行相同的程序,则需要采取必要的预防措施。 Rexx能够运行系统级命令。 有些命令可用于了解运行它的操作系统是什么。 根据输出,它可以采取适当的操作来查看可以在此操作系统上运行的命令。 例子 (Example) 以下示例显示

  • 我尝试了这个python脚本在windows上的portable Firefox中打开一个url,但是我得到了跟踪。 以下是回溯: 我正在使用: 你知道如何让便携式Firefox工作吗?