2014-10-24 3 views
-1

나는 UAC를 비활성화하여 시스템의 수명이 다할 때까지 응용 프로그램의 지속성을 유지할 수있는 대안으로 사용할 방법을 찾고 있습니다.UAC를 비활성화하는 대신

내 응용 프로그램은 시스템이 시작될 때마다 실행되며 상승 된 권한이 필요합니다. 따라서 UAC를 사용하면 시스템을 재부팅 할 때마다 사용자에게 응용 프로그램을 실행할지 여부를 묻습니다. 이것은 매우 지루하고 매번 발생하는 경우 성가 시게 될 수 있습니다. UAC를 사용하지 않도록 설정하면이 경고가 더 이상 나타나지 않지만 사용자 컴퓨터에 위협이 될 수 있으므로 사용자에게 매우 해로울 것입니다.

내 질문은; C++에서 매번 UAC 경고를받지 않고도 내 응용 프로그램에 대해서만 사용자 PC의 모든 이벤트에서 파일/응용 프로그램 지속성을 프로그래밍 방식으로 허용 할 수 있습니까?

나는 몇 일 동안이 프로그램에 갇혀 있었기 때문에 가능한 모든 방법, 악용, 우회 방법, 기타를 찾고 있습니다. 지금은 99.9 % 완료되었습니다. 내 프로젝트. 나는 이것을 정말로 이해할 필요가있다. 당신이 나에게 제공 할 수있는 조언에 대해 당신도 많이 감사합니다!

+6

필요한 관리 기능을 수행하는 서비스를 설치할 수 있습니다. UAC가 활성화 된 시스템에서 사용자에게 묻지 않고도 응용 프로그램을 향상시킬 수있는 방법은 없습니다. –

+1

"재부팅 할 때 내 응용 프로그램을 실행하십시오"라는 말은 꽤 기괴합니다. UAC의 작동 방식이 아닙니다. UAC에 대해 실제로 말하고 있는지 확인하십시오. –

+0

UAC 프롬프트를 무시하려고하는 것보다 고도가 필요하지 않도록 응용 프로그램을 변경하는 것이 더 쉽다는 가능성을 고려하십시오. – Dialecticus

답변

3

첫 번째 단계는 프로그램에 실제로 관리자 권한이 필요한지 여부를 확인하는 것입니다. 때로는 프로그램은 관리자 권한으로 만 실행되지만 사소한 이유로 로그 파일이 잘못된 위치에서 생성되거나 읽기 전용 액세스를 위해 열어야하는 파일이 전체 액세스를 위해 열리고있는 경우가 있습니다. 이 경우 문제를 해결하고 구조적 변화를 피할 수 있습니다.

두 번째로, 프로그램에 항상 관리자 권한이 필요한지 또는 사용자가 특정 작업을 수행 할 때만 요청하십시오. 후자의 경우, 그렇게해야 할 필요가있을 때만 상승해야합니다. 사용자가 재부팅 할 때마다 프로그램 실행을 승인 할 필요가 없다는 것을 의미 할뿐만 아니라 사용자가 의도하지 않은 관리 변경을하지 못하게합니다. UAC가 매번 암호를 요구하도록 구성된 경우 특히 관련이 있습니다.

셋째, 프로그램에 실제로 사용자 인터페이스가 필요한지 물어보십시오. 그렇지 않은 경우 시스템 서비스 여야합니다.

프로그램에 항상 관리자 권한이 필요하며 실제로 사용자 인터페이스가 필요한 경우 사용자 인터페이스가 포함 된 부분과 상승 된 권한이 필요한 기능이 포함 된 부분으로 나눠야합니다.

사용자 인터페이스 부분은 프로그램이 지금하는 것처럼 사용자가 로그인 할 때마다 실행되는 프로그램이어야합니다. 상승 된 권한 부분은 시스템 서비스 여야합니다.

기본 논리는 어느 부분에도 속할 수도 있고 2 개로 분할해야 할 수도 있습니다. 문맥에 전적으로 달려있다. 시스템 서비스에는 수행중인 권한있는 작업이 안전하고 적절하도록 보장 할 수있는 충분한 논리가 포함되어 있어야하며 사용자 인터페이스 부분에서 알 수있는 모든 작업을 수행 할 수 없습니다.

이 두 부분은 상호 작용할 수 있습니다 inter-process communication 및/또는 synchronization 형식을 사용하는 것이 가장 편리합니다. 서로 다른 원격 데스크톱 세션에 있다는 것을 알고 있어야합니다. 예를 들어 동기화를위한 이벤트 객체를 만드는 경우 이름은 Global\ 접두어로 시작해야합니다.

사용자 전환 또는 컴퓨터가 원격 데스크톱 서버이기 때문에 두 명 이상의 사용자가 동시에 로그인 할 수 있습니다. 이는 서비스 구성 요소가 여러 개의 동시 클라이언트를 지원해야한다는 것을 의미 할 수 있으며 이는 IPC 선택 및 구현에 영향을 미칩니다.또는 사용자 인터페이스 구성 요소는 다른 인스턴스가 이미 실행 중임을 감지하고 연결을 시도하기 전에 해당 인스턴스가 사라질 때까지 기다려야합니다.

로그인 한 사용자에게 관리자 권한이없는 경우 프로그램이 어떻게 반응하는지 고려해야합니다. 그런 사용자가 프로그램을 전혀 실행할 수없는 순간, 아마 관리자 사용자보다 프롬프트가 더 짜증나게됩니다! 관리자가 아닌 사용자가 프로그램을 정상적으로 작동하는 것이 정상이면 아무 것도 할 필요가 없습니다. 프로그램이 관리자가 아닌 사용자를 위해 작동하지 않아야하거나 일부 기능을 제한해야하는 경우 (a) GUI 구성 요소는 예를 들어 자동으로 종료되도록 적절하게 작동해야합니다. (b) 서비스 구성 요소가 GUI 구성 요소가 실행중인 컨텍스트를 확인해야합니다. GUI 구성 요소가 검사를 수행하는 것으로 충분하지 않습니다. 사용자가 원하는 경우 속임수를 사용할 수 있기 때문입니다. 서비스 구성 요소도 점검해야합니다.

가장 쉬운 방법은 아마도 GetTokenInformation을 TokenElevationType 옵션과 함께 사용하는 것입니다. 토큰 유형이 TokenElevationTypeLimited 또는 TokenElevationTypeFull이면 사용자에게 관리자 권한이 있습니다. 토큰 유형이 TokenElevationTypeDefault이면 분할 토큰이 없습니다. 사용자가 관리자가 아니거나 로컬 관리자 계정이거나 UAC가 꺼져있는 경우 이 경우 CheckTokenMembership을 사용하여 사용자가 Administrators 그룹에 있는지 여부를 확인하십시오.

일부 작업의 경우 UAC 승인을 요구하는 경우가 있습니다. 다른 작업도 승인하지 않아도됩니다. 이러한 작업에는 서비스 구성 요소가 필요하지 않습니다. GUI 구성 요소는 사용자의 동의하에 스스로 수행 할 수 있습니다.

+0

+1 문제에 대한 철저한 분석, 여러 관련 시나리오를 해결하는 방법에 대한 지침 및 숨겨진 장애물 지적. 시스템 서비스를 설치하려면 일반적으로 설치시 일회 확인으로 권한 상승이 필요하다는 것을 포함시킬 수 있습니다. – IInspectable