System.Runtime.InteropServices.COMException 참조된 어셈블리가 시스템에 설치되지 않았습니다

seung-jae hwang·2019년 3월 13일
0

test

목록 보기
2/2

TESTFFF

http://www.sysnet.pe.kr/2/0/950

ClickOnce - 관리자 권한 상승하는 방법
개인적으로, ClickOnce 에서 아쉬운 것이 있었다면 "관리자 권한 상승(Run as administrator)"이 불가능하다는 것입니다. 이전에도 제 웹 사이트 게시판에 아래와 같은 질문이 있었는데요.

[질문/답변] 클릭원스를 비스타에서 실행시
; http://www.sysnet.pe.kr/3/0/822
ClickOnce에 배포되는 .exe.manifest의 requestedExecutionLevel 값을 강제로 requireAdministrator 값을 주어도 "The Execution level requested by this application is not supported" 라는 오류 메시지만 클라이언트에 출력되고 동작되지 않습니다.

실제로 저 역시, 위에 제가 답변했던 그대로, 관리자 권한이 필요한 부분을 별도로 NT 서비스로 제작하고 클릭원스의 Bootstrapper에 넣어서 배포를 한 적이 있었습니다.

그런데, 갑자기... 오늘은 ^^; 늘 보아왔던 "작업관리자"의 "Show processes from all users" 버튼이 눈에 들어왔습니다. 

'그렇지! ClickOnce로 배포된 응용 프로그램도 자신을 실행할 때 권한상승시켜서 재실행하면 되지 않을까!' 라는 간단한 해답이었습니다. 1년이나 지나서 이런 생각이 드는군요. ^^;

구현 방법은 모두 공개되어 있습니다. 자신의 프로세스를 권한 상승시켜서 재실행하는 방법은 다음의 글에서 자세하게 소개해주고 있습니다.

Add a UAC shield to a button when elevation is required for admin tasks
; http://www.codeproject.com/KB/vista-security/UAC_Shield_for_Elevation.aspx
위의 방법을 클릭원스 상황에 맞게 적용시키면 되는데요. Form 이 실행되기 전에 "권한 상승된 프로세스"인지 스스로 점검하고, 그렇지 않은 경우라면 권한 상승시켜서 실행시키는 코드로 적절하게 바꾸는 것인데, 아래에 간단하게 실어보았습니다.

===== Program.cs =====
static class Program
{
[STAThread]
static void Main()
{
if (IsAdministrator() == false)
{
try
{
ProcessStartInfo procInfo = new ProcessStartInfo();
procInfo.UseShellExecute = true;
procInfo.FileName = Application.ExecutablePath;
procInfo.WorkingDirectory = Environment.CurrentDirectory;
procInfo.Verb = "runas";
Process.Start(procInfo);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
return;
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
public static bool IsAdministrator()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
if (null != identity)
{
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
return false;
}
}
===== Form1.cs =====
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
if (Program.IsAdministrator() == true)
{
this.Text += " (Administrator)";
}
}
}
예제 삼아서, 제 홈페이지에 위의 코드를 빌드시켜서 클릭원스로 배포한 경로는 다음과 같습니다.

WindowsFormsApplication1
; http://www.sysnet.pe.kr/temp/app/runasadmin/publish.htm
"Install" 버튼을 눌러서 실행시키면, 배포가 완료된 후 아래와 같이 권한 상승 창이 뜨고,

이후, 원했던 데로 "관리자 권한"으로 실행된 클릭원스 응용 프로그램을 확인할 수 있습니다. ^^ (다른 코드 없으니, 두려워하지 마시고 ^^ 그냥 실행해 보셔도 됩니다.)

물론, 여전히 권한 상승창은 사용자에게 귀찮은 작업이므로 "Bootstrapper + NT 서비스 배포"는 유용할 수 있습니다. 어쨌든, 이로써 클릭원스 배포의 한가지 장벽이 허물어지는군요. ^^

출처: http://www.sysnet.pe.kr/2/0/950

0개의 댓글