- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
问题:
我在代理上成功调用了 CoSetProxyBlanket(如果这是正确的术语),然后我在同一个代理上调用了 QueryInterface,但我收到了 0x80070005(“拒绝访问”)的结果。但是,如果我首先使用相同的凭据调用 CoInitializeSecurity (我试图避免这种情况),则调用会成功。
问题:
如何在不调用CoInitializeSecurity的情况下成功获取到自己需要的接口(interface)?据我了解,一个进程只能调用此方法一次,因此它与制作 dll 不兼容,通常可以用对 CoSetProxyBlanket 的调用来代替。
详细信息:
我正在尝试构建自己的 OPC 客户端,它可以与运行在不同域上的计算机通信,无需匹配的用户帐户。
首先,我创建一个身份结构,其中包含在服务器上有效的域、用户名和密码:
COAUTHINFO authInfo;
COAUTHIDENTITY authIdentity;
authIdentity.Domain = (unsigned short *) w_domain;
authIdentity.DomainLength = wcslen( w_domain);
authIdentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;
authIdentity.Password = (unsigned short *) w_password;
authIdentity.PasswordLength = wcslen(w_password);
authIdentity.User = (unsigned short *) w_username;
authIdentity.UserLength = wcslen(w_username);
authInfo.dwAuthnLevel = RPC_C_AUTHN_LEVEL_CALL;
authInfo.dwAuthnSvc = RPC_C_AUTHN_WINNT;
authInfo.dwAuthzSvc = RPC_C_AUTHZ_NONE;
authInfo.dwCapabilities = EOAC_NONE;
authInfo.dwImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
authInfo.pAuthIdentityData = &authIdentity;
authInfo.pwszServerPrincName = NULL;
ServerInfo.pAuthInfo = &authInfo;
然后我可以使用此服务器信息调用 CoCreateInstanceEx
并获取我的 OPC 服务器 (IID_IOPCServer
) 的句柄 (m_IOPCServer
)。
获得句柄后,我发现有必要通过此调用再次设置更多权限(参见 How does impersonation in DCOM work?):
hr = CoSetProxyBlanket(m_IOPCServer, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE,
&authIdentity, EOAC_NONE);
在此之后,我能够成功获得 OPC 项组的句柄:
hr = m_IOPCServer->AddGroup(L"", FALSE, reqUptRate, clientHandle,
NULL, NULL, lcid, &m_hServerGroup, &revisedUptRate,
IID_IOPCItemMgt,(LPUNKNOWN*)&m_IOPCItemMgt);
但是,当我尝试使用这段代码时:
hr = m_IOPCItemMgt->QueryInterface(IID_IOPCSyncIO, (void**)&m_IOPCSyncIO);
结果是 0x80070005(“拒绝访问”)。即使我在 m_IOPCItemMgt 上成功调用 CoSetProxyBlanket 也是如此。但是,如果我首先调用 CoInitializeSecurity,则调用会成功。
我认为问题与 How does impersonation in DCOM work? 有关因为 QueryInterface 函数是一种对象创建形式,所以它不使用与其他方法调用(如 AddGroup)相同的安全性。但是在 Microsoft 引用中 QueryInterface ,在给实现者的注释下,听起来 QueryInterface 不应该检查 ACL,并且在返回值下,没有提到 Access Denied 是一种可能性。我不认为这个问题是特定于实现的,因为我已经在一些著名的商业 OPC 服务器(例如 Matrikon Simulation Server)以及没有实现任何额外安全性的开源 LightOPC 上尝试了我的代码。
我猜我需要做的是找到一种方法来复制这个命令
hr = m_IOPCItemMgt->QueryInterface(IID_IOPCSyncIO, (void**)&m_IOPCSyncIO);
但同时提供 authIdentity
。这可能吗?可以使用 CoCreateInstanceEx 或 CoGetClassObject 或其他一些 COM 调用来完成吗?
最佳答案
无需过多赘述:CoInitializeSecurity 总是在每个进程中至少调用一次。这可以隐式或显式地完成。如果您的代码没有进行显式调用,DCOM 运行时会使用从注册表填充的参数为您完成。您可以尝试调整适当的注册表值以强制 DCOm 使用与显式调用中使用的值相似的值。保存这些值的注册表项是“HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID{AppID_GUID}” 此处描述了此项:https://msdn.microsoft.com/en-us/library/windows/desktop/ms693736(v=vs.85).aspx
关于c++ - 使用自定义标识调用 QueryInterface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39460079/
我正在 R 中使用 RecordLinkage 库。 我有一个包含 ID、姓名、电话、邮件的数据框 我的代码如下所示: ids = data$id pairs = compare.dedup(data
我目前正在构建一个新的 ASP.NET MVC 5 项目,我想在 9 月左右发布。我需要选择一个成员(member)系统,但我目前对我应该采取哪个方向感到很困惑。当前的 SimpleMembershi
我正在为 Brackets 定制一个大纲插件,它使用正则表达式来识别当前打开的文件的大纲。 我使用 regex101.com 创建了以下正则表达式(使用环视来确定该行以七个空格开头并以“SECTION
我已在表中将一列标记为“身份” create table Identitytest( number int identity(1,001) not null, value varch
我不知道那是字符串还是数组... char str4[100] = { 0 }; 那个代码是字符串? 如果是,它打印什么? 最佳答案 I dont know if that a string or a
我这里有一个场景,当用户想要重置密码时,系统必须通过电子邮件向用户发送一个随机生成的临时密码。我尝试将临时密码存储到数据库中的一个新列中,但我不确定这种方法是否有效。有些人建议使用 token,如下所
Vista 的现代 Windows 应用程序中有一个很好的功能。它是窗口标题中的图片。例如新的 skype (v4) 和 google chrome 都有它。 我在想它背后的技术是什么?如果你关闭 a
比较相同泛型类型的两个实例的最佳(最简洁和最佳)方法是什么,以便比较引用类型的身份(相同的对象,所以不是调用 Equals) 和 value 类型以获得值 equality。 目前我这样做: stat
我使用以下 C# 代码来获取处理器信息。如果我在虚拟机上运行我的应用程序,则管理类为空。我使用 Oracle VM VirtualBox 作为我的虚拟电脑 (Windows XP SP3) Syste
创建帐户后,Windows 帐户(本地、域、Active Directory)的 SID 是否会更改?如果是,在什么条件下。 最佳答案 是的,当您将帐户迁移到新域时,它会发生变化。 这就是您 AD 帐
我正在使用 Identity Server 4 并且我已经自定义了我的 ASP.NET Identity 用户,如下所示: public class ApplicationUser : Identit
我创建了一个 IIS 管理工具,旨在创建新应用程序、将它们分配到新的 AppPool,并为与该 AppPool 关联的身份添加所需的文件夹 ACL。根据this article ,每当创建新的应用程序
我使用 ASP.NET Identity .. 我想将 session 超时设置为无限制或最大值。我试过一些东西,但没有效果。注意:我使用共享主机。 谢谢你。 //web.config /
我有一台 Win 2008 R2 Enterprise 机器,它在几个网站上运行良好,每个网站都有自己的应用程序池。 我在向 IIS AppPool\A、IIS AppPool\B 等授予权限(使用
现有数据库模型(简化): 1 个用户可以加入 1 个或多个访问组。 1个AccessGroup可以有1个或多个AccessItens。 MSDN Says: When an identity is c
在具有单个表继承层次结构的 Hibernate/JPA 环境中使用 PostgreSQL 时,我看到了奇怪的行为。 首先是我的环境: PostgreSQL 8.3 Spring 2.5.6SEC01
是声明“一个类具有唯一标识”。是真是假? Java 中的对象有其唯一标识(至少通过它们的内存地址),但是类也有唯一标识吗?由于类不是对象,我对此感到困惑。或者是否需要实例化一个类(甚至可能)? 最佳答
我正在尝试通过将主要组件分解为单独的网络服务器来使用微服务架构来实现网络应用程序。我正在使用 ASP.NET Identity(仅电子邮件/用户名登录,无 Facebook 等)和“主”应用程序服务器
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How do you like your primary keys? 我知道使用 GUID 的好处,以及使用
我可以这样获取所有用户 var users = UserManager.Users.ToList(); 我能找到这样的角色 var role = db.Roles.SingleOrDefault(m
我是一名优秀的程序员,十分优秀!