2013-08-06 5 views
1

자동 모드로 C# 응용 프로그램에 .msi를 설치하는 가장 좋은 방법은 무엇입니까? msiexec을 사용하여 .msi 파일을 설치하려고하는데 어떻게해야할지 모르겠다. 문제는/qn과 함께 msiexec를 사용하는 것입니다. cmd.exe 프로세스에서 "관리자 권한으로 실행"해야하며 aC# 응용 프로그램과 유사한 작업을 수행하는 방법을 모르겠습니다 (자세한 내용은 wpf 프로젝트를 참조하십시오). VS 2010). 내가 와서 제일은 다음과 같습니다msiexec 및 c와 함께 msi를 설치하십시오.

Process p = new Process(); 
p.StartInfo.FileName = "runas.exe"; 
p.StartInfo.Arguments = "/user:Administrator cmd"; 
p.Start(); 

윈도우 팝업과 암호를 요청하지만이 동작은 꽤 추한 발견됩니다. 내 암호를 사용자에게 묻고 싶지 않습니다. 어쨌든 내 프로젝트를 시작하고 일종의 "관리자 권한으로 실행"(UAC가 팝업되지만 괜찮습니다)으로 설정하고 msiexec 명령을 실행하면됩니까? 또는 .msi 파일을 자동 설치하는 다른 방법이 있습니까? 대답은 매우 길기 때문에 어쩌면 누군가가 오해 :

코멘트없이 부결 누군가에도 불구하고 당신

답변

2

감사,이 IMO 아주 철저한 대답이다. 짧은 독서에 대한 권장 사항 : 옵션 2)을 선택하십시오.

먼저, 일반적으로 가능한 한 자주 RunAs를 피하십시오. RunAs를 사용하면 모든 시나리오와 응용 프로그램/프로세스에서 지원되지 않는 혼합 된 사용자 상황이 생성됩니다. XP보다 새로운 운영 체제에서는 실제로 필요하지 않습니다. UAC에서 관리자 권한이 필요합니다 (예 : .exe의 올바른 매니페스트)는 적어도 MS 추천입니다! : 내를 권장) 방법을

1) 가장 쉬운 ((그냥 보안 발언. 가장 안전한 방법은 여전히 ​​관리자 계정을 완전히를 RunAs도 UAC도 일반적으로 필요되도록 분리를 가지고있다)하지만 MSI 설치에 대한 관리자 권한이 아무 것도하지 않고 UAC가 작동하도록합니다. 의 MSI가 관리자 권한을 필요로하는 경우

는 UAC는 일반적으로 약간의 시간 (하지 설치 과정의 모든 부분 후 자체 올 것이다 그것은 시간이 좀 걸릴 것입니다, 그래서 관리자 권한이 필요합니다.

는 UAC 요청이 올 것을 보장하기 위해 . 자식 프로세스에서, 좀 UAC 상속, 당신은베이스 라인에서에서 ShellExecute를 사용해야 이것은 윈도우 일, MSI 또는 C#과 아무 상관이 C#에서

이 같은이 작업을 수행 할 수 있습니다.

ProcessStartInfo startInfo = new ProcessStartInfo(exeFile, arguments); 
StartInfo.UseShellExecute = true; 

원하는 경우별로 유용하지 않습니다. 설치 대화 상자가없는 자동 설치 (예. "/ qn").

더욱이 UAC는 이렇게 늦게 작은 단점이있다, 그래서 다음과 같은 권장하고 매우 안전 : 시작, 예를 들어,에서

2) 관리자 권한 부트 스트 래퍼에서 .exe : 확실한 경우 설치가 시작되어야하거나 일반적으로 앱에 자체 또는 하위 프로세스에 대한 관리자 권한이 있어야합니다. 앱 자체에 이미 관리자 권한이 있다는 것이 가장 좋습니다. 처음부터.
즉, 앱을 시작할 때 UAC가 나타납니다. 그런 다음 하위 프로세스는 관리자 권한도 가지며 ShellExecute 유형뿐만 아니라 CreateProcess 유형 하위 프로세스에도 적용됩니다.

이렇게하려면 다음 행을 포함하는 앱에 매니페스트를 추가하기 만하면됩니다.

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

어떻게 할 수 있습니까?

전체 Windows 7 전도는 매니페스트 ("삶의 감각은 무엇입니까? 응용 프로그램을 명시하는 것")을 기반으로한다는 사실을 감안할 때 비주얼 스튜디오는 지난 몇 년 동안 다른 버전이 실제로 훌륭하게 수행되지는 않았습니다 이것을 지원하는 일. 모든 버전이 다르며 C#, C++, VB 앱과 다릅니다. 갈

VS 2010 및 C#의 경우

방법은 다음과 같습니다 (. VB.Net를 들어,이 솔루션의 응용 프로그램 탭에서 '보기 Windows 설정'에있어, 내가 여기 읽은) 솔루션 탐색기에서

, 프로젝트를 마우스 오른쪽 단추로 클릭하고 "새 항목 추가", "새 요소"및 "응용 프로그램 매니페스트 파일"을 선택하십시오.

대문자로 클릭하면이 노드를 열고 대체 노드를 설명하는 주석 행과 함께 기존 노드를 찾을 수 있습니다. 당신이 그들에 대해 모른다면, 그것은 현대 윈도우에 관한 가장 중요한 것들 중 하나를 배우는 인터넷 검색의 좋은 포인트입니다.
level = "requireAdministrator"이 구성되고 완료되었습니다. 이제 앱에 높은 권한이 필요합니다. 빌드 후에 사용해보십시오.

(앱 원격 제어 또는 UI 테스트 응용 프로그램에서 같은 다른 애플리케이션의 UI를 자동화/제어해야 할 때까지 "있는 UIAccess"속성, 당신은, 무시할 수 있습니다.)

시작 MSI는 MSIEXEC "정상적으로 설치 .exe ... ". 올바른 장소에서 따옴표를 잊지 말고 오류 및 재부팅에 대한 반환 코드를 잡으십시오.

msiexec 대신 MSI API (외부 사용자 인터페이스)를 사용하는 것이 더 복잡합니다.

3) 관리자 권한이 전혀 없습니다. 유감스럽게도 프로그램 디렉토리에 설치가 가능한 표준 응용 프로그램에 대한 보안 정책은 불가능하거나 손상 될 수 있습니다. 물론 이것에 대해 더 자세히 말하면됩니다.

+0

누군가가 투표 한 이유에 관심이 있으십니까? 이것은 철저한 설명입니다. – Philm