非匿名方式访问远程的com+

windows server 2008 r2 COM+配置 1 服务器角色,增加“应用程序服务器”。 2 组件服务-计算机-我的电脑-属性-默认属性页的默认身份验证级别是“连接”,默认模拟级别是“标识” 3 COM安全页-访问权限-编辑限制,设置帐号“Everyone”为允许“本地访问”和“远程访问”。启动和激活权限为“Everyone”允许“本地启动”、“远程启动”、“本地激活”、“远程激活”。 阅读详情

windwos的安全机制规定:windows接收远程的com+调用的时候,会验证这个调用的权限。如果权限不够就出现经典的“拒绝访问”错误。

解决这个问题已知访问方式有:

1、匿名访问;在应用服务器(简称AP)启用guest,并且设置guest具有激活和访问COM+的权限。这条路是可行,不过安全性不能得到保证。

2、客户端电脑的登录用户和密码和AP上的一个用户一致,并且这个用户在AP上也具有相应的访问COM+的权限。这种方式要比第一种好一些,但是哪个单位的IT系统会是这种样子呢。肯定是每台机器都有自己的帐户密码。这个方式也不好。注:这种方式在不需要发布客户端软件到诺干多的机器上的时候也是可行的,比如访问COM+ 的是webServer.

3、在域管理的网络环境中,同样可以实现,但是有个问题,如果您的客户不愿意改造成域环境呢。所以这种方法也是有局限性的。

最后,我想到如果远程访问COM+的时候能够显式的给定用于AP验证权限的用户名和密码不是就可以解决这个问题了吗?事实上这个方式是可行的。不过在delphi7中还没有现成的函数可以达到这个目的。

comobj.pas 中有个函数 function CreateRemoteComObject(const MachineName: WideString;
  const ClassID: TGUID): IUnknown; 这个是用来创建远程的com+接口的。我要改造的主要是这个函数。

 

function CoCreateInstanceEx(const clsid: TCLSID;
  unkOuter: IUnknown; dwClsCtx: Longint; ServerInfo: PCoServerInfo;
  dwCount: Longint; rgmqResults: PMultiQIArray): HResult; stdcall; 这个函数可以用来创建远程的com+

ServerInfo 用来存储远程的服务器信息,包括访问和激活com+服务的帐户和密码。

我们来分析一下PCoServerInfo;
  PCoServerInfo = ^TCoServerInfo;
  _COSERVERINFO = record
    dwReserved1: Longint;
    pwszName: LPWSTR;
    pAuthInfo: Pointer;
    dwReserved2: Longint;
  end;

 

    pUnShort=^Word;
    pCoAuthIdentity=^_CoAuthIdentity;
    _CoAuthIdentity=record
        user:pUnShort;
        UserLength:ULONG;
        Domain:pUnShort;
        DomainLength:Ulong;
        password:pUnShort;
        PasswordLength:ulong;
        Flags:ulong;
    end;
    _CoAuthInfo=record
        dwAuthnSvc:DWORD;
        dwAuthzSvc:DWORD;
        pwszServerPrincName:WideString;
        dwAuthnLevel:Dword;
        dwImpersonationLevel:dword;
        pAuthIdentityData:pCoAuthIdentity;
        dwCapabilities:DWORD;
    end;
    TSocInfo=class(Tobject)
    public
        fcid:_CoAuthIdentity;
        fcai:_CoAuthInfo;
        ServerInfo: TCoServerInfo;
    end;

 

我们在CreateRemoteComObject中调用CoCreateInstanceEx的时候,首先给ServerInfo赋值如下

function CreateRemoteComObjectwh(const MachineName: WideString;
  const ClassID: TGUID): IUnknown;
const
  LocalFlags =CLSCTX_LOCAL_SERVER or CLSCTX_REMOTE_SERVER or CLSCTX_INPROC_SERVER;
  RemoteFlags = CLSCTX_REMOTE_SERVER;
var
    MQI: TMultiQI;
    ServerInfo: TCoServerInfo;
    IID_IUnknown: TGuid;
    Flags, Size: DWORD;
    LocalMachine: array [0..MAX_COMPUTERNAME_LENGTH] of char;
  ////  add by wanghui 2007-07-24
    Fcai:_CoAuthInfo;
    Fcid:_CoAuthIdentity;
     wUser,wDomain,wPsw:WideString;
    iiu:idispatch;
    fr:HRESULT;
begin
  if (GetObjectContext = nil)  then
  begin
        if @CoCreateInstanceEx =nil then
            raise Exception.CreateRes(@SDCOMNotInstalled);

    wUser:=getAppUserid();//用户名
    wDomain:=getappserver();//远程计算机名
    wPsw:=getAppPassword();//密码

    FillMemory(@Fcai,sizeof(Fcai),0);
    FillMemory(@FCid,sizeof(FCid),0);

    with fcid do begin
        user:=pUnshort(@wUser[1]);
        UserLength:=length(wUser);
        Domain:=pUnshort(@wDomain[1]);
        DomainLength:=length(wDomain);
        password:=pUnshort(@wPsw[1]);
        PasswordLength:=length(wPsw);
        Flags:=2;
    end;

    with fcai do begin
        dwAuthnSvc:=10;//winNt默认的鉴证服务   RPC_C_AUTHN_WINNT
        dwAuthzSvc:=$FFFFFF;//0;            //RPC_C_AUTHZ_NONE
        //pwszServerPrincName:=pwidechar(wDomain);
        dwAuthnLevel:=3;//0;
        dwImpersonationLevel:=3;//必须设置成模拟
        pAuthIdentityData:=@fcid;
        dwCapabilities:=$0;//$0800;
    end;
    FillMemory(@ServerInfo, sizeof(ServerInfo), 0);
    ServerInfo.pwszName := PWideChar(wDomain);
    ServerInfo.dwReserved1:=0;
    ServerInfo.pAuthInfo:=@fcai;

    IID_IUnknown := IUnknown;
    MQI.IID := @IID_IUnknown;
    MQI.itf := nil;
    MQI.hr := 0;

    if Length(MachineName) > 0 then
    begin
        Size := Sizeof(LocalMachine);  // Win95 is hypersensitive to size
        if GetComputerName(LocalMachine, Size) and  (AnsiCompareText(LocalMachine, MachineName) = 0) then
          Flags := LocalFlags
        else
          Flags := RemoteFlags;
    end else Flags := LocalFlags;
    OleCheck(CoCreateInstanceEx(ClassID, nil, CLSCTX_REMOTE_SERVER, @(ServerInfo), 1, @MQI));
    OleCheck(MQI.HR);
    Result := MQI.itf;
  end   else
  begin
        GetObjectContext.CreateInstance(ClassID, IUnknown, Result);
  end;
end;


以上代码 确保获取远程的com+的接口,接口类型为Iunkown

 

但是要访问其中的方法还需要用下面的函数来设置远程com本地引用的访问权限。

 with fcai do
        CoSetProxyBlanket(iu,dwAuthnSvc,dwAuthzSvc,pwidechar(pAuthIdentityData^.Domain),
            dwAuthnLevel,dwImpersonationLevel,pAuthIdentityData,dwCapabilities);

将这个函数封装后得到一个新函数

function SetProxyBlanket(iu:IUnknown):boolean;
var
    Fcai:_CoAuthInfo;
    Fcid:_CoAuthIdentity;
    wUser,wDomain,wPsw:WideString;
    iiu:idispatch;

    si:Tsocinfo;
begin

   wUser:=getAppUserid();//用户名
    wDomain:=getappserver();//远程计算机名
    wPsw:=getAppPassword();//密码
   if wDomain='127.0.0.1' then exit;
    FillMemory(@Fcai,sizeof(Fcai),0);
    FillMemory(@FCid,sizeof(FCid),0);
    // FillMemory(@FSvInfo,sizeof(FSvInfo),0);
    with fcid do begin
        user:=pUnshort(@wUser[1]);
        UserLength:=length(wUser);
        Domain:=pUnshort(@wDomain[1]);
        DomainLength:=length(wDomain);
        password:=pUnshort(@wPsw[1]);
        PasswordLength:=length(wPsw);
        Flags:=2;      //SEC_WINNT_AUTH_IDENTITY_UNICODE
    end;
    //以上填充_CoAuthIdentity结构
   with fcai do begin
        dwAuthnSvc:=10;//winNt默认的鉴证服务   RPC_C_AUTHN_WINNT
        dwAuthzSvc:=$FFFFFF;//0;            //RPC_C_AUTHZ_NONE
        //pwszServerPrincName:=pwidechar(wDomain);
        dwAuthnLevel:=3;//0;
        dwImpersonationLevel:=3;//必须设置成模拟
        pAuthIdentityData:=@fcid;
        dwCapabilities:=$0;//$0800;
    end;

      with fcai do
        CoSetProxyBlanket(iu,dwAuthnSvc,dwAuthzSvc,pwidechar(pAuthIdentityData^.Domain),
            dwAuthnLevel,dwImpersonationLevel,pAuthIdentityData,dwCapabilities);
end;

 

最后我们改造delphi自动生成的*_TLB.pas 中的函数CreateRemote 如下

class function Comymenu.CreateRemote(const MachineName: string): Imymenu;
var  iu:IUnknown;
begin
    iu:=CreateRemoteComObjectwh(MachineName, CLASS_mymenu);
    SetProxyBlanket(iu);
    result:=iu as Imymenu;
    SetProxyBlanket(IUnknown(result));
end;

 

 

参考了一些资料:MSDN,《windows安全性编程》。

软件环境:

  client  winXP SP2

AP: win2003 sp1


http://blog.youkuaiyun.com/looyo/article/details/1711546

【Linux】安装配置vsftpd(本地用户、匿名用户、虚拟用户)及vsftpd.conf配置文件详解 安装配置ftp(vsftpd)、配置本地用户、匿名用户、虚拟用户; vsftpd.conf文件详解;主动模式、被动模式等 阅读详情

相关推荐

手把手调试Android 10 DHCP服务:从dumpsys network_stack到DhcpServer.java的实战技巧

本文详细介绍了在Android 10中调试DHCP服务的实战技巧,从使用dumpsys network_stack分析服务状态到深入DhcpServer.java源码追踪问题。文章提供了完整的工具链配置、关键调试命令和常见问题解决方案,帮助开发者高效解决DHCP服务未启动、IP分配失败等典型问题,特别适合需要深入理解Android网络架构的开发者参考。

uu89012的博客 743

网络访问

一.两种访问的方式:POST,GET(不安全) GET请求和POST请求是有区别的, 具体的区别点有: (1)GET获取数据POST发送数据 ① get多用来直接获取数据,不修改数据 ② post则是发送数据到服务器端去存储。 (2)安全问题 ① get到服务器过程中数据都是在url中,也就是说要传送的 数据 是可以在链接里面看到,就有安全问题(不安全)。 ② post就不是在url里面所有还...

weixin_44270007的博客 310

219页华为供应链管理:市场预测S&OP计划、销售预测与存货管理精要

S&OP计划的整合作用:S&OP是一种综合的销售和运营计划流程,它将市场预测、生产能力、库存水平和财务目标整合在一起,以确保企业能够平衡供需,实现最佳的运营效率。持续监控与改进:市场预测、S&OP计划、计划委员会的决策以及存货管理都需要持续的监控和评估。供应链策略与执行:华为ISC拥有清晰的供应链策略,并通过SISC架构实现了策略的有效执行,包括供应链网络设计、库存管理、物流优化等。持续的供应链创新:华为ISC不断探索新的供应链管理方法和技术,如数字化供应链、智能物流等,以适应全球化和市场的快速变化。

zuoan1993的博客 2434

COM+在Windows 2003上的部署和调用

     使用COM+开发的软件,从XP转移到2003时出现了问题,客户端无论如何都访问不到安装在Windows 2003上的COM+服务。经过测试,找到了问题的原因,下面是对相关设置的描述和测试的经过。希望对各位朋友有帮助。^_^     COM+服务在Windows 2003 Server上部署后,客户端访问时报错“拒绝访问”,查阅优快云上的有关文章提示,在服务器的组件服务中做了

JasonDotWong的专栏 2616

用Matlab机器人工具箱搞定六轴机械臂建模:从DH参数到3D可视化(附完整代码)

本文详细介绍了如何使用Matlab机器人工具箱进行六轴机械臂建模,从DH参数输入到3D可视化全流程解析。通过正运动学验证、逆运动学求解和交互控制等实战技巧,帮助工程师快速掌握机械臂建模核心方法,并提供完整代码示例解决常见问题。

weixin_27372101的博客 394

避坑指南:英飞凌TC3XX的MCMCAN初始化常见错误及解决方法

本文针对英飞凌TC3XX系列MCU的MCMCAN模块初始化难题,深入剖析了寄存器配置时序、总线监控模式误用、中断映射错误及Message RAM地址冲突四大常见陷阱。通过实战代码示例和诊断流程,提供了清晰的避坑指南和解决方案,帮助嵌入式开发者高效解决CAN FD通信故障,确保汽车电子与工业控制项目的稳定运行。

weixin_29193259的博客 246

以远程计算机上的用户身份访问Com+应用

以远程计算机上的用户身份访问Com+应用DELPHI程序员开发com+应用的速度是非常快的,其主要原因是其较好地封装了com+的windows底层功能,开发人员通过较为简单的类继承就避开了复杂的com+底层技术细节,使开发人员将精力放在应用本身的功能上面。Delphi在封装com+应用时采取了许多折衷,在保留通用性的同时也避开了一些实现起来困难但是应用面不太广的com+底层特性。这些避开的特性中

liangma的专栏 5565

DataWorks数据安全治理最佳实践

DataWorks基于数据安全治理的常见思路,针对资产梳理、技术体系建设和运营体系建设,提供了一系列数据安全产品能力,您可通过“基础防护建设、数据安全防护措施及策略增强建设、数据安全持续运营”三个阶段在DataWorks上落地数据安全治理项目。参考本文启动数据安全治理项目前,建议您先了解DataWorks数据安全产品相关能力了解DataWorks数据安全产品能力后,您可参考如下三个阶段在DataWorks上落地数据安全治理项目。

soso1968的博客 1438

非域,非匿名用户访问远程企业服务的详细步骤

上篇博客我提到了非域,非匿名用户访问远程企业服务的关键就是在两台机子上建立一个用户名和密码完全一样的账户。然后配置ASP.net启用账号模拟,使用这个新加的账号来模拟。下面就是关于这部分的详细截图说明。 假设服务器a为企业服务主服务器, 服务器b为使用该企业服务的代理,同时b服务器上有一个ASP.net 的站点。 在服务器a上新建用户 complus , 同时这个用户属于: Distribut...

爱.NET 197

E2B Agent Runtime Sandbox 沙箱技术架构研究

本实现指南基于E2B的技术架构,提供了完整的基于Firecracker和Docker的Agent Runtime Sandbox后端服务实现方案。架构设计:参考E2B的分层架构,实现API层、管理层和虚拟化层Firecracker集成:深度集成Firecracker提供硬件级安全隔离完整功能:支持文件读写、shell执行、浏览器访问等核心功能生产就绪:提供Docker部署、监控、测试和安全配置可扩展性:设计支持水平扩展和高并发场景。

AI天才研究院 749

4、同轴3 - RRR球面并联机构运动分析与自主移动农业水果采摘机器人设计

本文研究了同轴3-RRR球面并联机构的运动学与速度分析,采用几何与数值方法进行位置分析,并利用螺旋理论简化雅可比矩阵的推导,通过ADAMS仿真验证了结果的准确性。同时提出一种新型自主移动农业水果采摘机器人设计,具备多功能末端执行器、水果软管转移系统和配重式静态稳定性结构,旨在减少采摘损伤、提升效率。文章还探讨了该机构在机器人控制与仿真中的应用潜力,以及采摘机器人在智能化升级与多机协作方面的发展方向。

y4z5a6b7的博客 246

调用远程的企业服务的安全问题

Windows 的安全机制规定:接收远程的com+调用的时候,会验证这个调用的权限。如果权限不够就出现经典的“拒绝访问”错误。 解决这个问题已知访问方式有: 匿名访问;简单来说就是在应用服务器(简称AP)上启用Guest账户,并且设置Guest具有激活和访问COM+的权限。这条路是可行,不过安全性不能得到保证。 客户端电脑的登录用户和密码和AP上的一个用户一致,并且这个用户在AP上也具

tanken welcome 622

基于STM32设计的智能门锁(微信小程序+手机APP等多种方式开锁)(188)

当前智能门锁项目是基于STM32微控制器、ESP8266-WIFI模块、OLED显示屏、指纹模块、蓝牙模块、门禁刷卡模块、烟雾检测模块、火光检测模块、温湿度检测模块等硬件设备开发的一种智能门锁系统

1万+

从本地网络快速访问远程洋葱服务:onionpipe导入onion地址与端口映射完全指南

**onionpipe** 是一个基于 Tor 网络的端口映射工具,它的核心能力是:把远程 **onion 地址**(.onion 服务)导入到你的本地网络,或把本地端口发布成全局唯一的洋葱服务。无需公网 IP、无需端口转发、无需依赖第三方中转服务,一条命令即可打通本地网络与洋葱服务之间的隧道。 本指南面向新手,带你从零开始掌握 **onion 地址导入**、**端口映射**、**客户端授权**

gitblog_00019的博客 384

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jailbreak-11:手把手搞定 PS4 11.00 越狱的 5 步完整实战

jailbreak-11 是面向 PS4 系统 11.00 及以下的实验性越狱工具,基于 TheFloW 公开的漏洞,用 Linux 计算机通过以太网直连 PS4,以 PPPoE 协议尝试完成 PS4 越狱。直说:项目仍在开发中,当前版本尚不可用,甚至可能永远无法正常工作。 ## ⚠️ 动手前:4 项检查先过一遍 - **系统版本**:PS4 固件必须在 11.00 或更低,11.01 及以上

gitblog_01099的博客 211

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

福州蛏抱蛋做法详解:一份菜谱文档在 all-in-rag 中的标准化结构与 RAG 数据准备实践

蛏抱蛋是流行于福建省福州地区的传统家常菜,以蛏子与鸡蛋的搭配为核心,兼具海鲜的鲜甜与蛋香的醇厚。本文以 all-in-rag 项目 `data/C8/cook` 菜谱数据集中《蛏抱蛋的做法》为样本,完整还原这道菜的可复刻做法,并深入讲解该项目 C8 章节"尝尝咸淡RAG系统"是如何将这样一份标准化的 Markdown 菜谱文档,转化为可被向量检索、结构分块与 LLM 生成直接使用的数据资产——读完

gitblog_00616的博客 946

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

从零到一:手把手教你玩转Linux核心服务(SSH/SCP/RSYNC/FTP)

SSH是一种安全的远程连接协议,通过加密技术保障数据传输安全。文章介绍了两种加密算法:对称加密(如DES)使用相同密钥加解密,速度快但安全性较低;非对称加密(如RSA)使用公钥加密、私钥解密,更安全但效率较低。SSH支持两种认证方式:基于用户名密码认证和基于密钥对的免密认证。后者通过公钥比对和随机字符串验证实现安全登录。实验部分展示了如何在两台Rocky Linux主机上配置静态IP、主机名和防火墙,为SSH连接做准备。

weixin_53177141的博客 131

【LLM】第二章:HuggingFace入门+大模型初体验

学习大模型,会使用HuggingFace是必备的,因为HuggingFace是大模型的框架。HF提供了一套围绕预训练模型构建的工具库,覆盖从数据处理到模型训练与推理的完整流程。

因为热爱所以坚持 353

什么是COM? 什么是COM+?

什么是COM? 所谓COM(Componet Object Model,组件对象模型),是一种说明如何建立可动态互变组件的规范,此规范提供了为保证能够互操作,客户和组件应遵循的一些二进制和网络标准。通过这 种标准将可以在任意两个组件之间进行通信而不用考虑其所处的操作环境是否相同、使用的开发语言是否一致以及是否运行于同一台计算机。 COM的优点? 首先:用户一般希望能够定制所用的应用...

weixin_33691817的博客 324

远程服务器不允许匿名登录,匿名远程访问COM+应用时被拒绝访问的问题

匿名远程访问COM+应用时被拒绝访问的问题08/28/20113 minutes to readIn this article有个客户在一个Win2k3的域下建立了一个COM+应用服务器,而客户端是一个工作组机器。为了重现这个场景,我们按照以下的方式,允许以匿名的方式访问调用COM+应用:如何以匿名方式远程调用COM+,但还是在客户端出现了拒绝访问的错误。在网络监视器中显示了拒绝访问错误(stat...

weixin_34827430的博客 1365
上一篇: 以远程计算机上的用户身份访问Com+应用
下一篇: 总结一下在VC中调用COM组件的方法+++VC调用远程COM+组件
embededvc
博客等级 码龄21年 176粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值