안녕하세요. 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 (디버깅) 또한 가능해 집니다.
즐거운 프로그래밍 시간 보내세요!
