.NET 애플리케이션을 관리자로 강제 실행하려면 어떻게합니까?


875

프로그램이 클라이언트 컴퓨터에 설치되면 Windows 7 에서 프로그램을 관리자로 강제 실행하려면 어떻게해야 합니까?


3
이진 걱정이 쓴 것 외에, 당신은 당신이 관리자 권한이있는 경우 테스트 코드를 작성 할 수 있습니다 .. (입니다 당신을 위해 무엇을 요구하고있다?)
lexu

38
나는이 작업을 가볍게하지 않을 것입니다. 실제로 관리자가 필요로하는 것을 확인하고 해결할 수 있는지 확인해야합니다. 항상 관리자 모드에서 앱을 실행하는 고객은 없습니다. 더 큰 고객은 그런 앱도 고려하지 않으며 로고 테스트가 중요하다면 그렇게하지 않을 것입니다.
Alex

2
알렉스는 많은 지적을하고 있습니다. 가능하면 필요한 경우에만 상승하고, 그렇지 않으면 그룹 정책, UAC 및 기타 여러 변수가 작용합니다. 최소한 UAC를 사용하면 사용자는 특정 사용자 작업이 수행되는 경우와 달리 모든 실행에서 권한을 부여해야합니다.
Anthony Mason

올바른 방법은 매니페스트 파일을 응용 프로그램에 포함시키는 것입니다.
Elmue

답변:


1144

프로그램에 포함 된 매니페스트를 수정하려고합니다. Visual Studio 2008 이상에서 작동합니다. Project + Add New Item, "Application Manifest File"을 선택하십시오. <requestedExecutionLevel>요소를 다음과 같이 변경하십시오 .

 <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

사용자는 프로그램을 시작할 때 UAC 프롬프트를 받습니다 . 현명하게 사용하십시오. 그들의 인내심은 빨리 마모 될 수 있습니다.


33
컴파일 할 때 ClickOnce 오류가 발생하면 다음 답변을 참조하십시오. stackoverflow.com/questions/11023998/…
SSS

17
프로젝트 속성에서 응용 프로그램 매니페스트도 사용하도록 프로젝트를 설정해야합니다. 프로젝트 속성에서 "응용 프로그램"탭을 확인하고 '자원'아래의 "Manifest :"가 app.manifest (또는 사용자가 지정한 이름)로 설정되어 있는지 확인하십시오. 매니페스트 파일)
Victor Chelaru

7
VS가 관리자 모드에서 다시 시작하라는 메시지를 표시하기 전에 프로젝트를 다시로드해야했습니다.
Jon

3
@Alejandro-예, UAC를 비활성화 할 수 있지만, UAC를 비활성화하면 사용자가 허용하는 최고 권한으로 모든 것이 실행되므로 앱이 자동으로 관리자 권한으로 실행됩니다 (사용자에게 관리자 권한이 있다고 가정). 문에 멋진 자물쇠를 설치하면 문을 제거하면 작동하지 않는다고 불평하는 것과 같습니다.
Erik Funkenbusch

4
@ErikFunkenbusch "자동으로 관리자로 실행"되지 않으며 사용자의 일반 권한 (사용자가 관리자 인 경우 관리자, 표준 인 경우 표준)으로 실행됩니다. 그 특정한 경우에 의존하는 것이 기본값이더라도 좋은 프로그램이 전염병처럼 피할 것입니다. 당신의 비유에 따르면, 멋진 잠금 장치는 훌륭하지만 모두 적절하지만 올바르게 설계된 소프트웨어는 문이 완전히 제거되는 경우를 거의 예상하지 않아야합니다.
Alejandro

154

requestedExecutionLevel매니페스트에 요소를 추가하는 것은 전투의 절반에 불과합니다. UAC 를 끌 수 있다는 것을 기억해야 합니다. 그렇다면 사용자가 관리자가 아닌 경우 구식 방법을 확인하고 오류 대화 상자를 표시해야합니다
( IsInRole(WindowsBuiltInRole.Administrator)스레드의 전화 CurrentPrincipal).


22
당신은 또한 사용할 수 있습니다 <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> 뿐만 아니라
마크 한 Kram에게

18
@MarkKram : 이것과 가장 높은 것은 무엇입니까? 문제는 관리자를 강제하는 것에 관한 것입니다. 고 가용성은 requireAdministrator보다 덜 제한적이며 관리자가 아닌 사용자가 UAC 프롬프트없이 앱을 시작하지 않고 관리자 만 프롬프트를 표시합니다.
Anders


더 이상 정확한 세부 사항을 기억하지 못하지만 이것이 장애인의 의미에 달려 있다고 생각합니다. "UAC 슬라이더"를 맨 아래에 놓는 것은 UAC를 비활성화하는 것과 다릅니다 (Vista 제외). UAC가 완전히 비활성화 된 경우 전체 무결성 수준 메커니즘이 비활성화되고 2000 / XP의 기본 runas.exe 기능 만 사용할 수 있습니다. 관리자 역할 확인은 runas.exe 사례를 처리합니다.
Anders

1
Server 2008 R2에서 EnableLUA를 0으로 설정하고 관리자 그룹에서 자신을 제거하고 재부팅 한 후 level = "requireAdministrator"를 지정하는 exe가 프롬프트없이 실행됩니다.
Tal Aloni

86

자세한 단계는 다음과 같습니다.

  1. 솔루션에 애플리케이션 매니페스트 파일 추가
  2. 응용 프로그램 설정을 "app.manifest"로 변경
  3. "requestedExecutionLevel"의 태그를 업데이트하여 관리자가 필요합니다.

솔루션에서 파일 추가

응용 프로그램 매니페스트 파일 선택

매니페스트 선택 옵션

매니페스트 파일 업데이트

이 코드를 사용하면 ClickOnce의 보안 설정을 해제해야합니다. 이렇게하려면 속성-> 보안-> ClickOnce 보안으로 이동하십시오.


New Item...설치 프로그램 서비스 프로젝트에서 옵션이 아닙니다. 앱 매니페스트 추가는 어떻게합니까? 메인 프로젝트에는 추가 할 수 있지만 설치 프로그램은 아닙니다.
HackSlash

61

수동으로 코드를 구현했습니다.

using System.Security.Principal;
public bool IsUserAdministrator()
{
    bool isAdmin;
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch (UnauthorizedAccessException ex)
    {
        isAdmin = false;
    }
    catch (Exception ex)
    {
        isAdmin = false;
    }
    return isAdmin;
}

45
영업의 요청에 따라이 단지 문맥 관리자로 실행중인 경우 응용 프로그램이 관리자로 실행하지 않는 forec 감지
매트 WILKO에게

5
나는 응용 프로그램이 자신의 파마를 높이도록 강제하는 프로그래밍 방법이 없다고 생각합니다. 있다면 보안 상 위험 할 것입니다.
Mark Richman

6
귀하의 솔루션은 좋지만 질문은 다릅니다. ;)
Yash

여기에있어서의 버전을 확인 리팩토링 stackoverflow.com/a/50186997 (주관)
하켄 Fıstık

이것은 질문에 대답하지 않습니다!
Elmue


19

Visual Studio 2008에서 작업하는 동안 마우스 오른쪽 단추를 클릭 Project -> Add New Item하고을 선택하십시오 Application Manifest File.

매니페스트 파일에는 태그 requestedExecutionLevel가 있으며 레벨을 세 가지 값으로 설정할 수 있습니다.

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

또는

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

또는

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

응용 프로그램이 관리자로 실행되도록 설정하려면 중간 응용 프로그램을 선택해야합니다.


작동합니다. 그러나 CMD 응용 프로그램을 실행할 때 빈 cmd 창이 나타납니다 (c # cmd 앱을 사용하여 백그라운드에서 일부 exe를 실행).
WM

13

에 따라

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

애플리케이션 매니페스트가 없거나 추가하는 방법을 모르는 경우 애플리케이션 매니페스트를 추가하려고합니다. 일부 프로젝트는 별도의 매니페스트 파일을 자동으로 추가하지 않으므로 먼저 프로젝트 속성으로 이동하여 응용 프로그램 탭으로 이동 한 다음 프로젝트가 탭 하단의 매니페스트를 제외하지 않는지 확인하십시오.

  • 다음으로 프로젝트를 마우스 오른쪽 버튼으로 클릭하십시오.
  • 새 항목 추가
  • 마지막으로 응용 프로그램 매니페스트 파일을 찾아 클릭하십시오.

12

Visual Studio 2010에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭하십시오. "Windows 설정보기"를 누르면 "app.manifest"라는 파일이 생성되어 열립니다. 이 파일에서 파일 내 주석 섹션에 설명 된대로 "asInvoker"를 "requireAdministrator"로 바꾸십시오.


6
이 답변은 일반적으로 VS 2010이 아닌 VB.NET :-)에 관한 것입니다. "새 항목 추가"답변은 C #에 관한 것입니다. C ++에서는 프로젝트 설정에서 할 수 있습니다.
Philm

12

코드에서만이 작업을 수행하는 또 다른 방법은 @NG의 답변 과 같이 프로세스가 관리자로 실행되고 있는지 감지 하는 것입니다. . 그런 다음 응용 프로그램을 다시 열고 현재 응용 프로그램을 닫으십시오.

응용 프로그램 자체를 서비스로 설치할 때와 같이 특정 조건에서 실행될 때 응용 프로그램에 관리자 권한 만 필요한 경우이 코드를 사용합니다. 따라서 다른 답변이 강제로 수행하는 것처럼 항상 관리자 권한으로 실행할 필요가 없습니다.

아래 코드 NeedsToRunAsAdmin는 현재 조건에서 관리자 권한이 필요한지 여부를 감지하는 방법입니다. 이것이 반환 false되면 코드는 스스로 상승하지 않습니다. 이것은 다른 방법보다이 방법의 주요 이점입니다.

이 코드에는 위에서 언급 한 장점이 있지만 항상 원하는 것은 아닌 새로운 프로세스로 다시 시작해야합니다.

private static void Main(string[] args)
{
    if (NeedsToRunAsAdmin() && !IsRunAsAdmin())
    {
        ProcessStartInfo proc = new ProcessStartInfo();
        proc.UseShellExecute = true;
        proc.WorkingDirectory = Environment.CurrentDirectory;
        proc.FileName = Assembly.GetEntryAssembly().CodeBase;

        foreach (string arg in args)
        {
            proc.Arguments += String.Format("\"{0}\" ", arg);
        }

        proc.Verb = "runas";

        try
        {
            Process.Start(proc);
        }
        catch
        {
            Console.WriteLine("This application requires elevated credentials in order to operate correctly!");
        }
    }
    else
    {
        //Normal program logic...
    }
}

private static bool IsRunAsAdmin()
{
    WindowsIdentity id = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(id);

    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}

1
코드 전용 접근 방식의 경우 +1 runas관리자가 아닌 사용자의 관리자 권한으로 무언가를 시작할 수 있으려면 UAC를 활성화해야 합니다. 그렇지 않으면 현재 사용자 권한 (Windows 7 64 비트에서 확인 됨)으로 자동으로 열립니다. UAC를 비활성화하고 관리자 권한이 누락 된 유일한 방법은 적절한 순간에 실행을 중지하는 것입니다.
reallynice

9

ClickOnce 보안 설정을 사용하여 매니페스트를 생성 한 다음 비활성화 할 수 있습니다.

Right click on the Project -> Properties -> Security -> Enable ClickOnce Security Settings

파일을 클릭하면 app.manifest 라는 프로젝트의 속성 폴더 아래에 파일이 만들어지며 Enable ClickOnce Security Settings옵션을 선택 취소 할 수 있습니다

해당 파일을 열고 다음 줄을 변경하십시오.

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

에:

 <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

프로그램에 관리자 권한이 필요합니다.


7

이것은 @NG에 의해 위 답변 의 단순화 된 버전입니다.

public bool IsUserAdministrator()
{
    try
    {
        WindowsIdentity user = WindowsIdentity.GetCurrent();
        WindowsPrincipal principal = new WindowsPrincipal(user);
        return principal.IsInRole(WindowsBuiltInRole.Administrator);
    }
    catch
    {
        return false;
    }
}

1
이것은 질문에 대답하지 않습니다!
Elmue 19

@ 방금 리팩토링 한 원래 답변에 의견을 추가하는 것이 더 논리적입니다. 내 답변에서 해당 답변에 대한 링크를 찾을 수 있습니다.
Hakan Fıstık

-3

실행 파일을 마우스 오른쪽 버튼으로 클릭하고 속성> 호환성으로 이동하여 '이 프로그램을 관리자 권한으로 실행'확인란을 선택하십시오.

모든 사용자에 대해 관리자 권한으로 실행하려면 '모든 사용자에 대한 설정 변경'에서 동일한 작업을 수행하십시오.


4
이것은 질문에 대답하지 않습니다. "프로그램이 클라이언트 시스템에 설치되면" "방법"이 아닙니다.
Joe

불분명해서 죄송합니다. 프로그램이 설치되면 실행 파일의 속성 (설치 프로그램이 아닌 기본 프로그램)에서이 설정을 변경하십시오. 그는 자신의 프로그램을 관리자 권한으로 실행하려고합니다.
SlickJayD

2
매니페스트에서 관리자 요구 사항을 설정하는 것이 좋습니다. 나는 그것이 질문에 대답한다고 주장하지만 간신히.
BradleyDotNET

3
@Joe 공정하게, 허용 된 답변은 응용 프로그램 exe를 다시 설치해야하므로 OPs 질문에 대답하지 않습니다. "프로그램이 설치되면"에 대한 해결책은 아닙니다. 이 downvoted 답변이 허용되는 답변보다 더 정확하면 해당 답변에 400 개 이상의 투표가있는 이유를 이해할 수 없습니다.
NickG

실제로 두 질문에 완벽하게 대답합니다. 일단 설치된 매니페스트를 변경할 가능성이 높지 않으며 프로그램은 많은 환경에서 일단 실행되면 권한을 높이려고 시도해서는 안됩니다. 대부분의 회사에서-이 답변은 사용자와 사용자의 권한에 대한 책임을지기 때문에 가장 좋습니다. 프로덕션 환경에서 "보거나"실행할 수없는 많은 코드를 작성합니다. 자신의 보안 문제보다 더 영리하지 마십시오.
jinzai
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.