提供几个点,仅供参考:
vista及以上:服务在session 0中,与桌面session相隔离,确认创建的ole对象是否只适用于非0的交互session
服务的账户是system还是其他如net service,不同用户权限差别很大。
由于服务程序不方便调试,建议打文件日志,将每个操作的结果或错误值输出以便查错。

解决方案 »

  1.   

    @ksrsoft 我也只能想到是我不会控制权限了。就是不知道怎么验证,或者怎么设置。
    @truexf
    1. 如何确认 Ole 对象“只适用于非0的交互session”?
    2. 服务的账号,我是用的默认的,应该就是 System 吧。但是,我修改成本机账号(含有 Admin 权限)。
        也没能起作用。说明一下:我已经登录,在桌面上手动操作的服务“Start”。
    请指点一下。
    谢谢。
      

  2.   

    确实跟session是有关的。
    TO 楼主:
    这个背后涉及的问题挺多的,比如Integrity level、session与session、session与desktop。Exe调用CreateOleObject,会以当前session、当前的desktop作为进程启动信息;所以在service调用时需要考虑,否则在当前desktop无法看到界面,甚至createoleObject失败。
    建议到MSDN多了解一下这方面的知识。下面这个链接中的转帖内容也可以看看
    http://blog.csdn.net/kaylc/article/details/7938714另外,你代码中的GetLastError,最好放在CreateOleObject下面。可能无效,因为API调用出错,如果没有第一时间GetLastError,可能会因程序在后续处理过程被重置——CreateOleObject内部不确定是否做了防护处理。
      

  3.   

    找到"abcdefg"(这个名称取决于你调用的Object是什么),然后右键->属性->安全 把读写权限都给everyone即可。
      

  4.   

    研究止于此。
    我没有继续下去,
    如果有人看到这里,可以查一下 
    1. Session 0 (隔离)
    2. CreateProcessAsUser
    或许有结题方案。