2016-10-21 3 views
2

추가 설치를 유발하는 MSI 패키지 제거 실패로 인해 MSI 로그에 2908 오류가 반환됩니다 (msiexec는 1603을 반환합니다). 서로 다른 포럼이 있었기 때문에 저는 지금 우리 솔루션을 제시하고 싶었고 몇 년 동안 프로그래밍 솔루션을 본 적이 없었기 때문에이 솔루션을 제공하기를 원했습니다.해결 방법 MSI 제거 실패 오류 2908 및 "UNKNOWN Components"레지스트리 키가 포함 된

일반적인 원인은 MSI 제거 프로그램은 마이크로 소프트 \ WINDOWS \ CurrentVersion을 \ 설치 \ UserData를 \ S-1-5-18 \ 구성 요소 \ SOFTWARE 아래 LOCALMACHINE 하이브에서 레지스트리에 "키를 고아"만듭니다이다

MSI (들) (2C : 0 ℃) [14 : 52 : 21 : 490] 참고 : 1 : 1,401 2 UNKNOWN \ 요소 \ B44598ECC622C01BD780AEC8E234E3E1 3 : 5 DEBUG 전형적인 MSIEXEC 로그 오차는 다음과 같다 : 오류 2908 : {CE89544B-226C-B10C-7D08-EA8C2E433E1E} 구성 요소를 등록 할 수 없습니다. MSI (2C : 0C) [14 : 52 : 21 : 523] : 제품 : 일부 소프트웨어 3.7 - 설치 프로그램에서이 패키지를 설치하는 중에 예기치 않은 오류가 발생했습니다. 이 패키지에 문제가 있음을 나타낼 수 있습니다. 오류 코드는 2908. 인수는 다음과 같습니다 {CE89544B-226C-B10C-7D08-EA8C2E433E1E},

다른 게시물 당신은 MSI 로그 파일에서 키를 찾아 Regedit를 함께 편집 할 수 있습니다 지적했듯이, '속성'및 '고급'을 선택하고 소유자를 '현재 소유자를 표시 할 수 없음'(또는 유사한 텍스트)에서 '관리자'로 변경하고이 링크의 지시에 따라 액세스 권한을 설정하십시오.

https://kb.acronis.com/content/33458

그러나 이것은 번거로워서 수백 가지 항목이 손상 될 수 있습니다. 더욱이 위의 수동 절차에는 Windows 10에 문제가있는 것으로 보이며 더 이상 사용할 수있는 "Windows Fixit"도구가 없습니다.

어떻게 자동으로이 문제를 해결할 수 있습니까? 이러한 "깨진"레지스트리 키는 권한이 상승 된 관리자가 다양한 오류를 발생시키는 경우에도 변경하기가 어렵 기 때문에 성공할 수 있도록 SYSTEM 계정의 서비스로 실행합니다.

나는 이렇게 SYSTEM으로 (SID는 S-1-5-18)가, 우리는 잘못된 항목의 상위 키를 열 실행 Visual Studio에서 Windows 서비스 프로젝트를 만든 :

RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); 

RegistryKey regParent = hklm.OpenSubKey(
    "SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Components", 
    RegistryKeyPermissionCheck.ReadWriteSubTree, 
    RegistryRights.FullControl); 
+0

질문은 어디에 있습니까? – raidensan

+0

나는 내 자신의 질문에 며칠 전에 대답했지만 결코 여기에 글을 남기지 않았다. 그래서 많은 사람들이이 질문에 대해 질문을했기 때문에 내가 여기 나온 대답에 유익한 텍스트를 쓰려고 생각했다. – Nihopteh

답변

1

부패한 키 수 나를 위해

regKey = regParent.OpenSubKey(
    registryKeyName, 
    RegistryKeyPermissionCheck.Default, 
    RegistryRights.TakeOwnership | RegistryRights.ReadPermissions | RegistryRights.ReadKey)) 

각 하위 키를 열기에 msiexec 깨진 문제의 키와 어떤 악화에 대해 "관리자 사용자"를 추가 한 것으로 보인다 때, SecurityException가 감지 할 규칙 상속은 완전히 어떤 이유로 작동이 중지되었습니다 , 나는 이것이 regedit canno 이유라고 생각한다. 키의 소유자를 보여줄 수는 없지만 키는 실제로 처음에는 고아가 아닙니다. 이 이상한 Admin 사용자 항목에 대해서 RegistryAccessRule을 제거하는 것은 도움이되지 않습니다. 해결 방법은 regParent에있는 사용자의 규칙을 다시 적용하는 것입니다.이 방법은 모든 하위 노드를 업데이트하고 "치료"하는 것 같습니다.

은 다음을 수행하는 것이 충분하다 :

security = regParent.GetAccessControl(AccessControlSections.All); 

    security.AddAccessRule(new RegistryAccessRule(
     new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null), 
     RegistryRights.FullControl, 
     InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, 
     PropagationFlags.None, // Self+Children 
     AccessControlType.Allow)); 

    security.AddAccessRule(new RegistryAccessRule(
     new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null), 
     RegistryRights.FullControl, 
     InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, 
     PropagationFlags.None, // Self+Children 
     AccessControlType.Allow)); 

    security.AddAccessRule(new RegistryAccessRule(
     new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null), 
     RegistryRights.ReadPermissions | RegistryRights.ReadKey | RegistryRights.EnumerateSubKeys | RegistryRights.QueryValues, 
     InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, 
     PropagationFlags.None, // Self+Children 
     AccessControlType.Allow)); 

    regParent.SetAccessControl(security); 

이것은 Regedit를 작업을하고 Msiexec가 다시 그 키를 변경하기에 충분합니다. 이제 부서진 제거 프로그램을 복구/제거 할 수 있습니다.

또한 시스템 계정에 서비스를 설치하고 시작하는 간단한 래퍼 응용 프로그램을 만든 다음 정리 프로세스가 끝난 후 서비스를 중지하면 제거합니다.

희망 사항은 여기에있는 것과 동일한 문제로 누군가를 도와 줄 수 있기를 바랍니다.