CServiceModule::Run

호출 되 고 후 서비스의 스레드 ID를 저장 처음 실행 서비스가이 ID 사용 하 여 Win32 API 함수를 사용 하 여 WM_QUIT 메시지를 보냄으로써 그 자체를 닫습니다 PostThreadMessage。

다음 Win32 API 함수를 호출 하는 실행 CoInitializeEx. 기본적으로 실행 함수에 COINIT_MULTITHREADED 플래그를 전달합니다. 이 플래그는 프로그램이 자유 스레드 서버를 나타냅니다.

이제 CSecurityDescriptor을 사용 하 여 보안을 지정할 수 있습니다. 이 클래스는 크게 설정 하는 작업을 단순화 하 고 임의 액세스 제어 목록 (DACL) 변경-액세스 제어 항목 (Ace) 각 ACE Win32 개체에 대 한 액세스를 정의 목록。

기본적으로 ATL COM 마법사 생성 CSecurityDescriptor의 InitializeFromThreadToken 멤버 함수를 호출 합니다. 이 모든 사용자 개체에 액세스할 수 있다는 것을 의미 하는 null DACL 개체의 보안 설명자를 초기화。

사용자 액세스를 변경 하는 가장 쉬운 방법은 거부 와 CSecurityDescriptor의 허용 멤버 함수입니다. 이러한 함수는 기존 DACL에 ACE를 추가 합니다. 그러나, Deny 항상 우선 이후 허용 끝에 추가 하는 동안 거부 는 DACL의 시작 부분에 ACE를 추가 합니다. 허용 과 거부 를 모두 전달 사용자 이름을 첫 번째 매개 변수 및 액세스 권한 (일반적으로 COM_RIGHTS_EXECUTE)와 두 번째。

InitializeFromThreadToken 에 의해 만들어진 null DACL을 모든 사용자가 COM 개체에 대 한 액세스 부여를 기억 합니다. 그러나 최대한 빨리 허용 ACE 추가를 전화만 하는 사용자가 액세스할 지정 합니다. 다음 코드는 허용 에 대 한 호출을 보여 줍니다.:

CSecurityDescriptor sd;
sd입니다.InitializeFromThreadToken ();

경우 (bAllowOneUser)
{
 nbsp; sd입니다.("MYDOMAIN\\myuser", COM_RIGHTS_EXECUTE)을 허용;
}
CoInitializeSecurity (sd,-1, NULL, NULL,
 ??????????????????? RPC_C_AUTHN_LEVEL_PKT,
 ??????????????????? RPC_C_IMP_LEVEL_IMPERSONATE,
 ??????????????????? NULL, EOAC_NONE, NULL)(&N)

만약 변수, bAllowOneUser , TRUE이면만 해당 사용자의 ACE는 DACL에 있기 때문에 하나의 사용자 지정에 접근할 수 있다. 경우 bAllowOneUser 은 false로, 다음 DACL이 null 때문에 모든 사용자가 액세스할。

서비스는 자체 보안을 지정 하지 않을 경우 제거 Win32 API 함수를 호출 CoInitializeSecurity및 COM 레지스트리에서 보안 설정을 확인 합니다. 이 문서의 뒷부분에서 설명 하는 DCOMCNFG 유틸리티와 함께 레지스트리 설정을 구성 하는 편리한 방법이입니다.

보안 지정 되 면 새로운 클라이언트 프로그램에 연결할 수 있도록 COM 개체 등록 됩니다. 마지막으로, 프로그램 실행 중인 SCM을 알려줍니다 그리고 프로그램 메시지 루프를 입력 합니다. 서비스 종료 시 종료 메시지가 게시 될 때까지 프로그램이 계속 실행 됩니다.

Windows NT 보안에 대 한 자세한 내용은 다음 웹 사이트를 참조 하십시오. MSDN 문서, "Windows NT 보안 이론 및 연습."

Index