silione,
Ну здесь, уже не прокатит трюк фиктивного отключения группы - в наличие неопределенные состояния групп, отсюда и глюки.
1. Нужно определить начальное состояние секций и групп.
2. Разработать логику переключения и рулить флагами секций.
И дальше "прыгать" по логическим меткам (Это вечная проблема с секциями в NSIS).
читать дальше »
Код:

!include "MUI2.nsh"
!include "Sections.nsh"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
InstType "все"
InstType "один"
OutFile "File.exe"
Section "Компонент №0" ID_0
SectionIn 1 2
SectionEnd
SectionGroup /e "Компоненты" IDG
Section "Компонент №1" ID_1
SectionIn 1
SectionEnd
Section /o "Компонент №2" ID_2
SectionEnd
SectionGroupEnd
SectionGroup /e "Компоненты 2" IDG2
Section "Компонент №3" ID_3
SectionIn 1
SectionEnd
Section /o "Компонент №4" ID_4
SectionIn 1
SectionEnd
SectionGroupEnd
Function .onInit
Push $0
StrCpy $R0 ${ID_1}
SectionGetFlags ${ID_1} $0
IntOp $0 $0 | ${SF_SELECTED}
SectionSetFlags ${ID_1} $0
SectionGetFlags ${ID_2} $0
IntOp $0 $0 & ${SECTION_OFF}
SectionSetFlags ${ID_2} $0
Pop $0
FunctionEnd
Function .onSelChange
Push $0
StrCmp $R0 ${ID_1} Check_ID_1
SectionGetFlags ${ID_1} $0
IntOp $0 $0 & ${SF_SELECTED}
IntCmp $0 ${SF_SELECTED} 0 Done Done
StrCpy $R0 ${ID_1}
SectionGetFlags ${ID_2} $0
IntOp $0 $0 & ${SECTION_OFF}
SectionSetFlags ${ID_2} $0
Goto Done
Check_ID_1:
SectionGetFlags ${ID_2} $0
IntOp $0 $0 & ${SF_SELECTED}
IntCmp $0 ${SF_SELECTED} 0 Done Done
StrCpy $R0 ${ID_2}
SectionGetFlags ${ID_1} $0
IntOp $0 $0 & ${SECTION_OFF}
SectionSetFlags ${ID_1} $0
Done:
Pop $0
FunctionEnd