문제

이 질문은 Windows Vista에 적용됩니다!

일반적으로 행정 특권없이 작동하는 응용 프로그램이 있습니다. 관리 권한이 필요한 하나의 활동이 있지만 대부분의 시간이 그 기능을 사용하지 않을 것이라는 것을 알면 더 높은 권한으로 응용 프로그램 자체를 시작하고 싶지 않습니다.

일부 이벤트에서 응용 프로그램의 권한을 높일 수있는 특정 방법에 대해 생각하고 있습니다 (예 : 버튼의 프레스). 예시:

사용자 가이 버튼을 클릭하면 UAC 대화 상자 또는 동의가 제기됩니다. 어떻게 할 수 있습니까?

도움이 되었습니까?

해결책

나는 현재 실행중인 프로세스를 높일 수 있다고 생각하지 않습니다. Windows Vista에 내장되어 있습니다. 제가 이해하는 것처럼 관리자 권한이 시작시 프로세스에 제공됩니다. UAC를 활용하는 다양한 프로그램을 살펴보면 관리 조치를 수행해야 할 때마다 실제로 별도의 프로세스를 시작하는 것을 알 수 있습니다 (작업 관리자는 하나입니다. Paint.net은 다른 것입니다. 후자는 실제로 .NET 응용 프로그램입니다. ).

이 문제에 대한 일반적인 솔루션은 높은 프로세스를 시작할 때 명령 줄 인수를 지정하는 것입니다 (Abatishchev의 제안은이를 수행하는 한 가지 방법). 완전한. 따라서 새로운 프로세스가 시작된 후 종료 된 후에는 눈에 띄지 않으며 동일한 앱 내의 새 대화 상자가 열린 것처럼 보일 것입니다 (특히 해커가 상승 과정 부모 과정의 자녀). 높은 액세스를 위해 UI가 필요하지 않은 경우 더 좋습니다.

Vista에서 UAC에 대한 전체 토론을 위해 이것은 기사를 통해 주제에 대해 (코드 예제는 C ++이지만, Winapi와 P/Invoke를 사용해야한다고 생각합니다. 어쨌든 대부분의 작업을 수행해야합니다). UAC 준수 프로그램을 디자인하는 것은 사소한 것과는 거리가 멀지 만, 적어도 적어도 올바른 접근 방식을 보게되기를 바랍니다.

다른 팁

말했듯이 거기:

Process.StartInfo.UseShellExecute = true;
Process.StartInfo.Verb = "runas";

레지스트리에서 필요한 모든 것을 수행하기 위해 관리자로서 프로세스를 실행하지만 일반 권한을 가진 앱으로 돌아갑니다.

다음 MSDN KB 제 981778 조는 응용 프로그램을 '자체 전기'하는 방법을 설명합니다.

http://support.microsoft.com/kb/981778

Visual C ++, Visual C#, Visual Basic.net에는 다운로드 가능한 샘플이 포함되어 있습니다.

이 접근법은 별도의 프로세스를 시작해야 할 필요성을 해결하지만 실제로는 고가 사용자로 실행되는 원래 응용 프로그램입니다. 그럼에도 불구하고 이것은 별도의 실행 파일에서 코드를 복제하는 것이 실용적이지 않은 일부 상황에서 여전히 매우 유용 할 수 있습니다.

고도를 제거하려면 응용 프로그램을 종료해야합니다.

COM 객체로 고도로 실행하려면 UAC 모니 커와 코드가 필요합니다.

이 질문을 참조하십시오.

MSDN에 대한 문서.

아마도 누군가 가이 간단한 예를 들고 편리하게 나옵니다.

using System;
using System.Linq;
using System.Reflection;
using System.Diagnostics;
using System.Security.Principal;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    internal static class Program
    {
        private class Form1 : Form
        {
            internal Form1()
            {
                var button = new Button{ Dock = DockStyle.Fill };
                button.Click += (sender, args) => RunAsAdmin();
                Controls.Add(button);

                ElevatedAction();
            }
        }

        [STAThread]
        internal static void Main(string[] arguments)
        {
            if (arguments?.Contains("/run_elevated_action") == true)
            {
                ElevatedAction();
                return;
            }

            Application.Run(new Form1());
        }

        private static void RunAsAdmin()
        {
            var path = Assembly.GetExecutingAssembly().Location;
            using (var process = Process.Start(new ProcessStartInfo(path, "/run_elevated_action")
            {
                Verb = "runas"
            }))
            {
                process?.WaitForExit();
            }
        }

        private static void ElevatedAction()
        {
            MessageBox.Show($@"IsElevated: {IsElevated()}");
        }

        private static bool IsElevated()
        {
            using (var identity = WindowsIdentity.GetCurrent())
            {
                var principal = new WindowsPrincipal(identity);

                return principal.IsInRole(WindowsBuiltInRole.Administrator);
            }
        }

    }
}

나는 이것이 오래된 게시물이라는 것을 알고 있지만, 이것은 Marcp의 제안을 접사하는 다른 사람에게 반응합니다. 그가 언급 한 MSDN 게시물은 실제로 모든 코드 예제에서 응용 프로그램을 다시 시작합니다. 코드 샘플은 다음을 사용합니다 runas 동사는 이미 다른 제안에서 제안되었습니다.

확인을 위해 코드를 다운로드했지만 원래 MSDN 기사에서 나온 것입니다.

4. 예를 클릭하여 고도를 승인하십시오. 그런 다음 원래 애플리케이션이 다시 시작되어 높은 관리자로 실행됩니다.
5. 응용 프로그램을 닫습니다.

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