我将WindowsXP配置为构建计算机。构建过程在不是管理员的帐户下运行。
有些项目将ocx控件的最后一步注册为
regsvr32 /s /c ".\debug\myocx.ocx"
此步骤失败,我认为这与权利有关,因为在管理员帐户下执行相同操作正常。
我需要为构建帐户提供哪些权利/权限/策略以及我在哪里执行此操作? (浏览本地用户和组以及本地安全设置对我没有帮助)
答案 0 :(得分:11)
通过regedit,您需要在“HKEY_CLASSES_ROOT”上提供构建帐户权限。
右键单击HKEY_CLASSES_ROOT并选择Permissions ... Full Control。
答案 1 :(得分:1)
注册OCX归结为在HKLM下的注册表中编写条目。默认情况下,非管理员帐户没有权限,我不太确定您的构建帐户应该是什么(在我的书中安装调试OCX仍然是“安装”(v.s. building))。
答案 2 :(得分:0)
答案 3 :(得分:0)
虽然可能只是grant full control of the HKCR key,但这可能会导致授予不必要的更多访问权限。在研究如何执行此操作时,最终我最终放弃了HKCR的权限,因此需要重新映像计算机。为了提出这个脚本,我使用了procmon工具,并过滤了拒绝的注册表权限,然后在脚本中授予了它们。
以下PowerShell脚本仅对那些我确定注册DLL(因此是OCX)所必需的键创建(非继承)权限。这允许单个帐户(在本例中为构建服务器代码生成器帐户)被授予访问权限,而无需管理员即可注册DLL。设置规则时要使用的帐户替换第一个变量$buildAcctUserName
-。
$buildAcctUserName = "AzureDevOpsBuilder"
# Create Rule for full control of keys that need to be added to/updated/deleted from
$user = New-Object System.Security.Principal.NTAccount("$($env:COMPUTERNAME)\$buildAcctUserName")
$rule = New-Object System.Security.AccessControl.RegistryAccessRule(
$user,
[System.Security.AccessControl.RegistryRights]"FullControl",
[System.Security.AccessControl.InheritanceFlags]"ContainerInherit, ObjectInherit", <# ContainerInherit / None / ObjectInherit #>
[System.Security.AccessControl.PropagationFlags]::None,
[System.Security.AccessControl.AccessControlType]::Allow)
# Grant access to HKCR
$regHKCRHive=[Microsoft.Win32.RegistryHive]::ClassesRoot;
$regHKCRBaseKey=[Microsoft.Win32.RegistryKey]::OpenBaseKey($regHKCRHive,[Microsoft.Win32.RegistryView]::Default)
$regkey=$regHKCRBaseKey.OpenSubKey("", $true)
$acl = $regkey.GetAccessControl()
$acl.SetAccessRule($rule)
$regkey.SetAccessControl($acl)
# Grant access to HKLM\Software
$regHKLMHive=[Microsoft.Win32.RegistryHive]::LocalMachine
$regHKLMBaseKey=[Microsoft.Win32.RegistryKey]::OpenBaseKey($regHKLMHive,[Microsoft.Win32.RegistryView]::Default)
$regkey=$regHKLMBaseKey.OpenSubKey("SOFTWARE", $true)
$acl = $regkey.GetAccessControl()
$acl.SetAccessRule($rule)
$regkey.SetAccessControl($acl)
# Grant access to HKLM\Software\Wow6432Node
$regkey=$regHKLMBaseKey.OpenSubKey("SOFTWARE\Wow6432Node", $true)
$acl = $regkey.GetAccessControl()
$acl.SetAccessRule($rule)
$regkey.SetAccessControl($acl)
# Grant access to HKCR\Wow6432Node\CLSID
$regkey=$regHKCRBaseKey.OpenSubKey("Wow6432Node\CLSID", $true)
$acl = $regkey.GetAccessControl()
$acl.SetAccessRule($rule)
$regkey.SetAccessControl($acl)
# Grant access to HKCR\TypeLib
$regkey=$regHKCRBaseKey.OpenSubKey("TypeLib", $true)
$acl = $regkey.GetAccessControl()
$acl.SetAccessRule($rule)
$regkey.SetAccessControl($acl)
# Grant access to HKCR\Wow6432Node\Interface
$regkey=$regHKCRBaseKey.OpenSubKey("Wow6432Node\Interface", $true)
$acl = $regkey.GetAccessControl()
$acl.SetAccessRule($rule)
$regkey.SetAccessControl($acl)
# Grant access to HKCR\Interface
$regkey=$regHKCRBaseKey.OpenSubKey("Interface", $true)
$acl = $regkey.GetAccessControl()
$acl.SetAccessRule($rule)
$regkey.SetAccessControl($acl)
# Grant access to HKCR\AppID
$regkey=$regHKCRBaseKey.OpenSubKey("AppID", $true)
$acl = $regkey.GetAccessControl()
$acl.SetAccessRule($rule)
$regkey.SetAccessControl($acl)