VB :: Lecture & TIPs

[VB.NET] 관리자 권한으로 응용 프로그램 실행하기

안녕하세요. HappyBono 인사드립니다.

응용 프로그램 (Application) 을 개발하다보면 관리자 권한을 취득하여 실행되는 프로그램을 개발하여야 하는 경우들이 존재합니다.

일반적으로 다른 웹사이트나, 온라인 개발자 커뮤니티에서 권장하는 방법은 app.manifest 파일에 존재하는 requestExcuetionLevel 항목 하위의 level 속성 값을 “asInvoker” 값으로 설정해 둔 후 [Security (보안)] 탭에서 ClickOnce 보안 설정 사용 체크 표시를 해제해두는 방법인데요,

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

이 부분을

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

이렇게 변경하신 후 ClickOnce 보안 설정 사용 체크 표시를 제거한 다음 Compile (컴파일) 하면 .exe 형식의 실행 파일에 방패 모양의 아이콘이 추가되어 확실하게 관리자 권한이 취득된 후 실행됩니다만, 한 가지 약점을 꼽자면 배포 문제에 있습니다.

바로 [ClickOnce (클릭원스)] 를 통한 배포가 불가능하며, [F5] 키를 눌러 디버깅을 시도하면 실행이 되지 않을 가능성도 높아지기에, 앞서 다른 웹사이트에서 권장하던 방법 보다는 응용프로그램 (Application) 자체에서 실행될 때 관리자 권한이 취득된 상태인지 여부를 확인 한 후 관리자 권한이 아닌 경우 관리자 권한으로 스스로를 다시 실행하고, 기존 인스턴스는 자동적으로 종료하는 방법이 효율적일 것 같아서 아래와 같이 코드를 작성해보았습니다.

코드 최상단에 두 개의 Namespace (네임스페이스) 를 선언해두시구요.

Imports System.Reflection
Imports System.Security.Principal

아래의 코드를 붙여넣으세요.

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    If Not IsRunningAsAdministrator() Then
        Dim processStartInfo As ProcessStartInfo = New ProcessStartInfo(Assembly.GetEntryAssembly().CodeBase)
        With processStartInfo
            .UseShellExecute = True
            .Verb = "runas"
            Process.Start(processStartInfo)
            Application.Exit()
        
        End With
    Else
        Me.Text += " " & "(Administrator)"
    End If
End Sub

Public Function IsRunningAsAdministrator() As Boolean
    Dim windowsIdentity As WindowsIdentity = WindowsIdentity.GetCurrent()
    Dim windowsPrincipal As WindowsPrincipal = New WindowsPrincipal(windowsIdentity)
    Return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator)
End Function

이렇게 하시면 프로그램 실행 후 창 상단 타이틀에 [Administrator (관리자)] 텍스트가 표시되는 것을 확인하실 수 있습니다.

다만, 소스 코드를 키보드의 [F5] 키를 눌러 실행하시는 경우에 Debugging (디버깅) 모드는 종료되고 컴파일된 .exe 형식의 실행 파일이 실행될 수 있어서 Debugging (디버깅) 이 불가능 할 수 있는데요.

이러한 경우, Visual Studio (비주얼스튜디오) 를 [Run as Administrator (관리자 권한)] 으로 실행하고 디버깅을 하면 If 문을 통과하기 때문에 Debugging (디버깅) 또한 가능해 집니다.

즐거운 프로그래밍 시간 보내세요!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: