我遇到基于COM的客户端 - 服务器设置问题.COM服务器使用C#(.NET 4.0)编写,并作为(注册的)本地服务器运行.
根据连接到服务器的应用程序,其他客户端将收到服务器执行失败(HRESULT异常:0x80080005(CO_E_SERVER_EXEC_FAILURE)
这里解释了潜在的问题(在COM部分是完整性感知的部分).我理解它的方式,是由于提升的应用程序创建具有更高完整性级别的服务器这一事实.当另一个未提升的应用程序连接时,不允许连接到同一个实例.当非提升的应用程序创建进程时,在提升的应用程序连接之后也会发生同样的情况.
我试图实现页面上描述的解决方案:修改注册表以设置应允许所有客户端连接的安全描述符.在C++中有一个代码示例,但这在.NET中实际上是相同的:
// Security Descriptor with NO_EXECUTE_UP
var sd = new RawSecurityDescriptor("O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;LW)");
byte[] securityDescriptor = new Byte[sd.BinaryLength];
sd.GetBinaryForm(securityDescriptor, 0);
RegistryKey key = Registry.ClassesRoot.OpenSubKey("AppID\\{APP-ID-GUID}", true);
if (key == null)
{
key = Registry.ClassesRoot.CreateSubKey("AppID\\{APP-ID-GUID}");
}
using (key)
{
key.SetValue("LaunchPermission", securityDescriptor, RegistryValueKind.Binary);
}
Run Code Online (Sandbox Code Playgroud)
但是,这没有达到预期的效果.当第二个客户端尝试创建相关对象的实例时,Windows会尝试启动COM服务器的单独实例,但服务器会阻止两个实例作为同一用户运行.鉴于我设置的权限,我不希望第一个实例启动第二个实例.
由于其中一个客户端应用程序在Medium IL中运行,而另一个客户端应用程序在High IL中运行,因此我还在强制标签上尝试了变体,例如:
O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;ME)
O:BAG:BAD:(A;;0xb;;;WD)S:(ML;;NX;;;LW)(ML;;NX;;;ME)(ML;;NX;;;HI)
Run Code Online (Sandbox Code Playgroud)
我也尝试ROTFlags按照页面上的建议将注册表项设置为0x1(ROTFLAGS_ALLOWANYCLIENT),但行为仍然没有变化.
我已经确定LaunchPermission注册表值正在以某种方式使用.我无法发现使用Process Monitor读取它的位置,但是当我使用该dcomcnfg.exe工具设置相同的密钥时,我可以通过拒绝启动权限来强制服务器加载失败.
我想指出我的服务器进程不需要提升.如何使提升和非提升的进程都能够连接到单个服务器实例?
我正在构建Windows的MSI安装程序并使用signtool对安装程序进行签名.当我运行.msi进行测试时,UAC(用户帐户控制)提示出现,询问我是否要允许安装继续进行.没关系,但是提示显示了许多字段,而对于Program Name字段,它显示的内容类似于"403b3.msi".这不是我正在运行的msi的名称.
如何才能显示正确的程序名称?
我试图用一系列屏幕截图记录工作流程.在流程中的某一点上,会出现UAC提示,我想抓住它的位图以使我的故事板完整.由于UAC提示位于虚拟桌面(或类似的东西)上,因此通常的Alt + PrintScreen不起作用.有什么建议?
是否可以在Windows中运行C++应用程序以在运行时从操作系统请求管理员权限?
我知道它可以在编译时完成,但似乎无法在任何地方找到它是否可以在运行时完成.
谢谢你的帮助!
编辑:如果我希望当前实例具有提升的权限怎么办?例如,我可能将数据存储在我想要保留的内存中.
我有一个产品安装程序可执行文件,可以将一些文件复制到用户的硬盘上.它不是正常意义上的典型安装程序(它不会向"开始"菜单或"程序文件"文件夹添加任何内容).
每次在Vista上运行安装程序时,在exe终止后,Vista会生成一个任务对话框:
是否有一个函数我需要从exe或注册表项调用来设置,以指示操作系统正确安装程序(或至少压制此消息)?
相关问题: Windows 7 RC中的"此程序可能未正确安装"消息(适用于Windows 7特定问题)
我正在编写一个修改实用程序来修改一些键HKEY_CLASSES_ROOT.
所有在Windows XP等下工作正常.但是我Requested registry access is not allowed在Windows 7下遇到错误.Vista和2008我也猜错了.
我应该如何修改我的代码以添加UAC支持?
我试图在Windows 8.1上安装Xampp win32-1.8.2.我收到一条消息说"因为系统上激活的用户帐户用户帐户可能会限制XAMPP的某些功能." 我试图更改用户帐户控制设置,但仍然有警告.并且APACHE没有启动.我也禁用了我的IIS,但仍然没有工作.我该怎么办?谢谢.
我在Win 7 RTM x64上创建了一个.NET C#WinForms应用程序,假设我已经调用了DataInstaller.
当我在调试器之外运行这个程序时(这只是一个没有功能的空表单),它可以正常工作,直到我关闭表单.然后,我从程序兼容性助手那里收到一条消息:
此程序可能未正确安装
然后,我可以选择使用推荐的设置重新安装,或者说安装确实按预期工作.
如果我将应用程序命名为"DataThingy",这不是问题,我想这与程序调用*Setup获得UAC屏蔽图标的方式有关.
我假设我可以将一些简单的东西放在应用程序清单中以防止这种情况发生?
我不确定这是否发生在Vista上,因为我目前没有访问权限.
更改名称不是一个选项,关闭UAC不是一个选项,所以请不要建议这个!
编辑:
我的天啊.
似乎如果以下任何一种情况属实,UAC坚持:
exe名称包含单词Installer
AssemblyInfo.cs中
AssemblyTitle contains the word 'Installer'
e.g. [assembly: AssemblyTitle("DataInstaller")]
AssemblyProduct contains the word 'Installer'
e.g. [assembly: AssemblyProduct("Data Installation Utility")]
Run Code Online (Sandbox Code Playgroud)
'Installer'也可以是'Setup'.
它乞丐信仰,它真的.显然,其中一位老VB6程序员已经在Redmond重新安置到UAC团队.
我仍然需要一个解决方法,我不准备接受我的应用程序不可能被称为安装程序,因为它不会触及注册表或将任何文件放在Program Files文件夹中.
我假设如果我尝试执行名为IAmAVirus.exe的应用程序,UAC会将机器置于完全锁定状态.(实际上,我不敢尝试,因为我并不完全相信我只是愚蠢)
我的Vista应用程序需要知道用户是"以管理员"(提升)还是以标准用户(非提升)方式启动它.我怎样才能在运行时检测到它?
Java中是否有办法要求系统控制管理员功能.当然没有这样做:右键单击exe - >以管理员身份运行.
我想要的是来自UAC的框架,如Windows Vista或Windows 7.
或者我从jar中制作exe时要做一些设置?