sourcecode

프로세스 권한을 프로그래밍 방식으로 승격하시겠습니까?

codebag 2023. 5. 28. 20:44
반응형

프로세스 권한을 프로그래밍 방식으로 승격하시겠습니까?

InstallUtil을 사용하여 서비스를 설치하려고 합니다.를 통해 호출되는 exe.Process.Start코드는 다음과 같습니다.

ProcessStartInfo startInfo = new ProcessStartInfo (m_strInstallUtil, strExePath);
System.Diagnostics.Process.Start (startInfo);

어디에m_strInstallUtil는 "InstallUtil.exe"에 대한 완전한 경로 및 exe입니다.strExePath서비스에 대한 정규화된 경로/이름입니다.

상승된 명령 프롬프트에서 명령행 구문을 실행하면 작동하지만, 내 앱(위 코드 사용)에서 실행하면 작동하지 않습니다.프로세스 상승 문제를 처리하고 있는 것 같은데, 상승된 상태에서 프로세스를 어떻게 실행해야 합니까?확인해야 합니까?ShellExecute이것 때문에?

이 모든 것은 Windows Vista(윈도우 비스타)에 있습니다.관리자 권한으로 승격된 VS2008 디버거에서 프로세스를 실행하고 있습니다.

설정도 해봤습니다.startInfo.Verb = "runas";하지만 문제가 해결되지는 않은 것 같습니다.

다음과 같이 startInfo 개체의 Verb 속성을 'runas'로 설정하여 새 프로세스를 상승된 사용 권한으로 시작해야 함을 나타낼 수 있습니다.

startInfo.Verb = "runas";

그러면 Windows가 "관리자 권한으로 실행" 메뉴 명령을 사용하여 탐색기에서 프로세스를 시작한 것처럼 동작합니다.

이는 UAC 프롬프트가 표시되고 사용자가 이를 승인해야 함을 의미합니다. 이 메시지가 바람직하지 않은 경우(예: 긴 프로세스 도중에 발생하기 때문에),애플리케이션 매니페스트 생성 및 포함(UAC)에 의해 상승된 권한으로 전체 호스트 프로세스를 실행해야 '사용 가능한 최고' 실행 수준이 요구됩니다. 이렇게 하면 앱이 시작되자마자 UAC 프롬프트가 나타나고 추가 프롬프트 없이 모든 하위 프로세스가 상승된 권한으로 실행됩니다.

편집: 방금 질문을 편집해서 "runas"가 당신에게 효과가 없다고 말씀하셨습니다.그것은 정말 이상한 일입니다. (여러 프로덕션 앱에서도 마찬가지입니다.)그러나 매니페스트를 포함하여 상위 프로세스가 높은 권한으로 실행되도록 요구하는 것은 확실히 효과적일 것입니다.

이 코드는 위의 모든 것을 통합하고 admin 권한으로 현재 wpf 앱을 다시 시작합니다.

if (IsAdministrator() == false)
{
    // Restart program and run as admin
    var exeName = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
    ProcessStartInfo startInfo = new ProcessStartInfo(exeName);
    startInfo.Verb = "runas";
    System.Diagnostics.Process.Start(startInfo);
    Application.Current.Shutdown();
    return;
}

private static bool IsAdministrator()
{
    WindowsIdentity identity = WindowsIdentity.GetCurrent();
    WindowsPrincipal principal = new WindowsPrincipal(identity);
    return principal.IsInRole(WindowsBuiltInRole.Administrator);
}


// To run as admin, alter exe manifest file after building.
// Or create shortcut with "as admin" checked.
// Or ShellExecute(C# Process.Start) can elevate - use verb "runas".
// Or an elevate vbs script can launch programs as admin.
// (does not work: "runas /user:admin" from cmd-line prompts for admin pass)

업데이트: 앱 매니페스트 방법을 선호합니다.

visual studio에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고, 새 응용 프로그램 매니페스트 파일을 추가하고, 위에 표시된 대로 requireAdministrator set을 사용하도록 파일을 변경합니다.

원래 방식의 문제:app.xaml.cs OnStartup에 다시 시작 코드를 넣으면 Shutdown(종료)이 호출되더라도 기본 창이 잠시 시작될 수 있습니다.만약 app.xaml.cs 가 실행되지 않고 특정 레이스 조건에서 이것이 실행된다면 나의 메인 창은 폭파될 것입니다.

기사에 따르면 Chris Corio: MSDN Magazine, 2007년 1월호, Windows Vista 사용자 계정 컨트롤을 사용하여 앱을 올바르게 작동시키는 방법만 알려줍니다.ShellExecute포함된 매니페스트를 확인하고 필요한 경우 사용자에게 권한 상승을 묻는 메시지를 표시합니다.CreateProcess다른 API는 그렇지 않습니다.도움이 되길 바랍니다.

참고 항목: .chm과 동일한 문서.

[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]

이렇게 하면 UAC가 없어도 됩니다. 새 프로세스를 시작할 필요가 없습니다.내 경우처럼 실행 중인 사용자가 관리자 그룹의 멤버인 경우.

저는 이것이 매우 오래된 게시물이라는 것을 알지만, 저는 단지 제 솔루션을 공유하고 싶었습니다.

System.Diagnostics.ProcessStartInfo StartInfo = new System.Diagnostics.ProcessStartInfo
{
    UseShellExecute = true, //<- for elevation
    Verb = "runas",  //<- for elevation
    WorkingDirectory = Environment.CurrentDirectory,
    FileName = "EDHM_UI_Patcher.exe",
    Arguments = @"\D -FF"
};
System.Diagnostics.Process p = System.Diagnostics.Process.Start(StartInfo);

참고: Visual Studio가 이미 Upgrated를 실행하고 있는 경우 UAC 대화 상자가 나타나지 않고, 이 대화 상자가 빈 폴더에서 exe를 실행하는지 테스트합니다.

상태를 높이려면 가장을 사용해야 합니다.

WindowsIdentity identity = new WindowsIdentity(accessToken);
WindowsImpersonationContext context = identity.Impersonate();

작업이 완료되면 가장된 컨텍스트를 실행 취소하는 것을 잊지 마십시오.

언급URL : https://stackoverflow.com/questions/133379/elevating-process-privilege-programmatically

반응형