我正在服务器上安装程序,并从另一台计算机上卸载该程序。
服务器:Windows Server 2008 R2 计算机:Windows 7 Ultimate
我在同一位置找到了安装程序和卸载程序。这两台机器位于具有组策略强制设置的域中。
当安装程序时,它们会停止在
“C:\Lumesnion\admin\smc.exe”/regserver
在安装日志中。它们停在
“C:\Lumesnion\admin\smc”/unregserer
在卸载日志中。
这是注册表编辑器被锁定的问题吗?我无法获得有关它们为何卡在那里的任何信息。我已通过 regedit 启用注册表编辑,但它们仍然挂起。
有人能告诉我 /regserver 和 /unregserver 实际上在做什么以及我如何修复它以便程序真正成功安装吗?
编辑 1:忘记添加我是域管理员和机器上的本地管理员。我正在使用“以管理员身份运行”安装程序。
编辑2:安装Lumension 设备控制。
编辑 3:刚刚进行了测试并使用进程监视器启动了安装程序,它在要安装 smc.exe 的文件夹中显示“FAST IO DISALLOWED”。仍在进行一些研究,想知道这是否与问题有关。据我所知,/regserver 用于注册 DCOM 值,但 Fast I/O 才是注册的内容。除非我没有正确理解。我错了吗?
答案1
谁能告诉我 /regserver 和 /unregserver 实际上在做什么?
除了通过 IClassFactory2 处理的许可问题之外,安装程序通常还会创建必要的注册表项,以使组件在 COM 和 OLE 上下文中正常运行。
此外:
这些数据的存在允许任何相关方(例如希望集成此新组件的应用程序)确定服务器是否支持自我注册,而无需先加载 DLL 或 EXE。
如果服务器被打包在 DLL 模块中,则 DLL 必须导出函数 DllRegisterServer 和 DllUnregisterServer。任何希望指示服务器注册自身(即其所有 CLSID 和类型库 ID)的应用程序都可以通过 GetProcAddress 函数获取指向 DllRegisterServer 的指针。在 DllRegisterServer 中,DLL 创建其所有必要的注册表项,为所有 InprocServer32 或 InprocHandler32 项存储指向 DLL 的正确路径。
当应用程序希望从系统中删除组件时,它应通过调用 DllUnregisterServer 取消注册该组件。在此调用中,服务器将删除它之前在 DllRegisterServer 中创建的那些条目。服务器不应盲目删除其类的所有条目,因为其他软件可能存储了其他条目,例如 TreatAs 键。
如果服务器被打包在 EXE 模块中,则希望注册服务器的应用程序将使用命令行参数 /RegServer 或 -RegServer(不区分大小写)启动 EXE 服务器。如果应用程序希望取消注册服务器,则它将使用命令行参数 /UnregServer 或 -UnregServer 启动 EXE。自注册 EXE 会检测这些命令行参数,并分别在 DllRegisterServer 和 DllUnregisterServer 中调用与 DLL 相同的操作,将其模块路径注册在 LocalServer32 下,而不是 InprocServer32 或 InprocHandler32 下。
“这是注册表编辑器被锁定的问题吗?”
这很可能与您不是域管理员有关。但是,根据您提供的信息,我们无法毫无疑问地回答这个问题。
谁能告诉我 /regserver 和 /unregserver 实际上在做什么?
它只是注册应用程序,以便它可以与COM 库
这两台机器位于具有组策略强制设置的域中
.....
当安装程序时,它们会停止在
.....
我该如何修复它以便程序能够真正成功安装?
最简单的解决方法是让具有活动域管理员权限的用户安装该应用程序。