문제

보호 된 경로 ( %programfiles %)에서 몇 가지 작업을 수행 해야하는이 응용 프로그램이 있습니다. %AppData %를 사용해야한다는 것을 알고 있지만 지금은 변경할 수 없습니다. UAC가 다른 프로젝트에 나타나도록 요구할 수있는 모든 것을 격리했습니다. 샘플 코드는 다음과 같습니다.

using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;

class Class1
{
    static void Main(string[] args)
    {
        try
        {
            File.CreateText(Path.Combine(Application.StartupPath, "something.txt"));
        }
        catch (UnauthorizedAccessException ex)
        {
            MessageBox.Show(ex.Message, "UnauthorizedAccessException", MessageBoxButtons.OK, MessageBoxIcon.Error);

            if (args.Length == 0)
            {
                Process proc = new Process();
                proc.StartInfo.FileName = Application.ExecutablePath;
                proc.StartInfo.Arguments = "not again";
                proc.StartInfo.Verb = "runas";
                proc.Start();
            }
            else
            {
                MessageBox.Show("Exit to avoid loop.");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}

그래서 저는 메인 프로그램 에서이 실행 파일을 호출하고 무단 액세스로 인해 실패하면 UAC 요청을 보여주는 자체가 시작됩니다.

내 질문은 다음과 같습니다.

1) DLL에서 UAC 고도를 요청할 수있는 방법을 찾을 수 없었기 때문에 프로젝트 출력을 DLL에서 EXE로 변환해야했습니다. 쉬운 방법이 있습니까?

2) 또한 일부 프로그램은 프로그램 로고와 그 모든 것들이있는 개인화 된 UAC 메시지를 보여줍니다. 예를 보여 드리겠습니다.

Ugly UAC

Personalized UAC

내 프로그램을 위해 어떻게 할 수 있습니까?

3) 고가의 권한으로 실행될 때 루프에 들어가는 것을 피하기 위해 또 다른 무단으로 된 ARGSECCESSECTION을 얻습니다. 같은 목표를 달성하기 위해 무엇을 하시겠습니까?

지금은 그게 전부라고 생각합니다. 시간 내 줘서 고마워.

도움이 되었습니까?

해결책

1 DLL을 호스팅하는 프로세스의 고도 모드를 제어 할 수 없습니다. 당신은 할 수 있습니다 대상 폴더 또는 레지스트리에 권한을 부여합니다 모두를위한 설치 과정에서 설치 프로세스를 제어 할 수있는 경우.

2 당신은 필요합니다 클라이언트가 신뢰할 수있는 인증 기관이 게시 한 인증서로 프로그램에 서명하십시오.. 현지 인증서 상점 (제어판-> 인터넷 옵션, 콘텐츠 탭, 게시자)을 방문하여 일반 인증 기관을 확인하십시오.

3 무단 AccessExceotion을 받으면 호스팅 EXE에 던지거나 보안 문제를 나타내는 오류 값을 반환하십시오. 그런 다음 DLL의 발신자는 프로그램이 이미 상승했는지 (도메인 컨트롤러에 의해 부여되지 않은 권한) 또는 사용자에게 알리기 위해 보안 오류 대화 상자를 표시하는 것과 같이해야 할 일을 결정합니다. runas 명령을 사용하여 높은 모드로 프로세스 재시작 그것이 높아지지 않은 경우.

다른 팁

나는 같은 문제가 있었다. 약 2 일 정도의 인터넷 검색 내 요구에 맞는 유일한 솔루션을 찾았습니다. 관리 권한으로 응용 프로그램을 시작하십시오. 응용 프로그램을 시작하고 관리자로 실행되는지 확인하십시오. 그리고 그렇지 않다면 - 재시작 행정 권리로.

    static void Main(string[] args)
    {
        if (NeedElevation(args) && Elevate(args))
        { // If elevastion succeeded then quit.
            return;
        }
        // your code here
    }

    public static bool Elevate(string[] args)
    {
        try
        {
            ProcessStartInfo info = Process.GetCurrentProcess().StartInfo;
            info.Verb = "runas";
            info.Arguments = NoElevateArgument;
            foreach (string arg in args)
            {
                info.Arguments += ' ' + arg;
            }
            info.FileName = Assembly.GetEntryAssembly().Location;

            Process process = new System.Diagnostics.Process();
            process.StartInfo = info;

            process.Start();
        }
        catch (Exception)
        {
            MessageBox.Show("You don't have administrative privileges thus the Automatic Application Updates cannot be started. But the rest of application is available as usually.",
                "Not enough user rights", MessageBoxButtons.OK, MessageBoxIcon.Information);
            return false;
        }

        return true;
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top