[c#] 필요한 경우에만 권한을 높이는 방법은 무엇입니까?

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

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

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

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



답변

현재 실행중인 프로세스를 향상시킬 수 있다고 생각하지 않습니다. 내가 이해하는 바와 같이 시작시 프로세스에 관리자 권한이 부여되는 것은 Windows Vista에 내장되어 있습니다. UAC를 활용하는 다양한 프로그램을 살펴보면 관리 작업을 수행해야 할 때마다 실제로 별도의 프로세스를 실행하는 것을 볼 수 있습니다 (작업 관리자는 하나, Paint.NET은 다른 하나, 후자는 실제로 .NET 응용 프로그램입니다). ).

이 문제에 대한 일반적인 해결책은 상승 된 프로세스를 시작할 때 명령 줄 인수를 지정하는 것입니다 (abatishchev의 제안은이 작업을 수행하는 한 가지 방법입니다). 이렇게하면 시작된 프로세스가 특정 대화 상자 만 표시 한 다음이 작업이 완료된 후 종료됩니다. 완료되었습니다. 따라서 새로운 프로세스가 시작되었다가 종료되었다는 사실을 사용자가 거의 알아 차릴 수 없으며, 동일한 앱 내에서 새 대화 상자가 열린 것처럼 표시됩니다 (특히 해커가 메인 창을 만들려면 상위 프로세스의 하위 프로세스). 상승 된 액세스를위한 UI가 필요하지 않은 경우 더욱 좋습니다.

Vista에서 UAC에 대한 전체 토론을 보려면 주제에 대한 기사통해이 문서 를 참조하는 것이 좋습니다 (코드 예제는 C ++로되어 있지만 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. 응용 프로그램을 닫습니다.


답변