Windows 정책 제어 관련 도구와 프레임워크

안녕하세요. 오랫만에 많은 분들에게 도움이 될 수 있는 오픈 소스 프로젝트를 추가로 시작했습니다.

식탁보 개발 과정에 활용할 강력한 도구로 Windows 정책 제어를 돕는 도구와 프레임워크를 개발했습니다. 크게 세 가지 구성 요소로 이루어지는데요,

우리가 익히 알고 있는대로, Windows용 소프트웨어들은 파일, 환경 변수, 그리고 레지스트리를 이용하여 프로그램의 설정을 받아들입니다. 그런데 잘 문서화되어있지 않은 영역이 하나 더 있는데, 바로 "정책"에 관한 부분입니다.

문서화되어있지 않아서 굉장히 어렵게 느껴지던 부분이지만, 핵심 메커니즘을 정리하면 다음과 같습니다.

  • IGroupPolicyObject, IGroupPolicyObject2 인터페이스로 %windir%\System32 디렉터리 아래의 GroupPolicy 디렉터리나 GroupPolicyUsers 디렉터리 안에 목적에 맞게 정의된 POL 파일을 편집하는 편집기 COM 객체를 얻습니다.
  • 얻어온 인터페이스 포인터를 이용하여 편집기와 소통하면서 시스템으로 지속적으로 올려보낼 (덮어쓸) 레지스트리 키와 값의 내역을 POL 파일 안에 저장하거나, 저장된 POL 파일의 내역을 읽습니다. 이 때, 별도의 새로운 API를 쓰지 않고 레지스트리 핸들만 얻어 기존의 Win32 레지스트리 API를 씁니다. (이 때 .NET의 레지스트리 API를 써도 잘 동작합니다.)
  • 최종적으로 POL 파일을 저장하는 Save 메서드를 호출하고, 필요하다면 RefreshPolicy Win32 API를 호출해서 곧바로 Group Policy Client가 레지스트리에 POL 파일의 내용을 바로 덮어쓰도록 유도합니다.

이 때, 우리가 그룹 정책 편집기에서 보던 엄청난 수의 정책 설정 항목들은 어디서 온 것인가 하는 궁금증이 들 겁니다. 이 내용들은 %windir%\PolicyDefinitions 폴더 안에 ADMX 파일, 그리고 지역화된 문자열들은 이 디렉터리 아래의 각 언어 코드 폴더 별로 ADML 파일들로 저장됩니다. 그룹 정책 편집기는 이 ADMX 파일과 ADML 파일들을 읽어서 MMC 콘솔 상의 사용자 인터페이스를 구성하는데 사용하는 것입니다.

지금 이야기한 두 가지 요소를 모두 다룰 수 있는 종합적인 라이브러리를 그래서 위와 같이 세 종류로 만들게 되었습니다.

한 가지 흥미로운 것은, Windows 컨테이너 기술을 이용함에도 Windows 샌드박스의 경우 Group Policy Client 서비스가 비활성화되어있어, POL 파일을 편집하더라도 정책을 올려보내줄 주체가 없어 (정확히 말하면 서비스는 설치되어있지만 시작할 수 없도록 시스템 레벨에서 보호된 상태여서) 식탁보 OSS 버전의 경우 ADMX 파일의 스키마 부분만 인용해서 레지스트리에 직접 설정을 덮어쓰는 동작을 구현하고자 하며, 반면 Windows 컨테이너의 경우에는 gMSA 같이 Active Directory로부터 정책을 전달받는 부분 때문인지 Group Policy Client 서비스가 켜져있습니다.

또한 정책 설정을 이용하면 Office, Microsoft Edge, Google Chrome은 물론 VMware나 기타 여러 엔터프라이즈향 소프트웨어들의 설정을 안정적으로 제어할 수 있기 때문에 소프트웨어 개발 과정에서 큰 도움이 될 수 있습니다.

이들 프로젝트 개발에 관심이 있으시다면 많은 의견 부탁드립니다! 많은 참여와 공유가 큰 힘이 됩니다.

고맙습니다!

8개의 좋아요