IT story

C #에서 프로세스를 관리자 모드로 시작하는 방법

hot-time 2020. 9. 18. 19:23
반응형

C #에서 프로세스를 관리자 모드로 시작하는 방법 [중복]


이 질문에 이미 답변이 있습니다.

Visual Studio Windows 앱 프로젝트가 있습니다. 설치 프로그램 업데이트 파일을 다운로드하는 코드를 추가했습니다. 다운로드가 완료된 후 설치 프로그램을 실행하려면 관리자 권한이 필요합니다. 매니페스트 파일을 추가했습니다.

사용자가 DownloadUpdate.exe를 클릭하면 UAC는 사용자에게 관리자 권한을 요청합니다. 그래서 DownloadUpdate.exe 내에서 생성되고 호출 된 모든 프로세스가 관리자 권한으로 실행될 것이라고 가정했습니다. 그래서 다음 코드를 사용하여 다운로드 한 파일을 설정 호출했습니다.

Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.FileName = strFile;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;

이 시도:

//Vista or higher check
if (System.Environment.OSVersion.Version.Major >= 6)
{
   p.StartInfo.Verb = "runas";
}

또는 애플리케이션의 매니페스트 경로로 이동합니다 .


먼저 프로젝트에 포함시켜야합니다.

using System.Diagnostics;

그런 다음 사용하려는 다른 .exe 파일에 사용할 수있는 일반적인 방법을 작성할 수 있습니다. 다음과 같습니다.

public void ExecuteAsAdmin(string fileName)
{
    Process proc = new Process();
    proc.StartInfo.FileName = fileName;
    proc.StartInfo.UseShellExecute = true;
    proc.StartInfo.Verb = "runas";
    proc.Start();
}

예를 들어 notepad.exe를 실행하려면 다음 메서드를 호출하면됩니다.

ExecuteAsAdmin("notepad.exe");

이것은 귀하의 질문에 대한 명확한 대답입니다. .NET 응용 프로그램을 관리자 권한으로 실행하려면 어떻게해야합니까?

요약:

프로젝트-> 새 항목 추가-> 애플리케이션 매니페스트 파일을 마우스 오른쪽 버튼으로 클릭합니다.

그런 다음 해당 파일에서 다음과 같은 줄을 변경하십시오.

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

컴파일하고 실행하십시오!


var pass = new SecureString();
pass.AppendChar('s');
pass.AppendChar('e');
pass.AppendChar('c');
pass.AppendChar('r');
pass.AppendChar('e');
pass.AppendChar('t');
Process.Start("notepad", "admin", pass, "");

ProcessStartInfo 와 함께 작동합니다 .

var psi = new ProcessStartInfo
{
    FileName = "notepad",
    UserName = "admin",
    Domain = "",
    Password = pass,
    UseShellExecute = false,
    RedirectStandardOutput = true,
    RedirectStandardError = true
};
Process.Start(psi);

이것은 내가 그것을 시도 할 때 작동합니다. 두 개의 샘플 프로그램을 다시 확인했습니다.

using System;
using System.Diagnostics;

namespace ConsoleApplication1 {
  class Program {
    static void Main(string[] args) {
      Process.Start("ConsoleApplication2.exe");
    }
  }
}

using System;
using System.IO;

namespace ConsoleApplication2 {
  class Program {
    static void Main(string[] args) {
      try {
        File.WriteAllText(@"c:\program files\test.txt", "hello world");
      }
      catch (Exception ex) {
        Console.WriteLine(ex.ToString());
        Console.ReadLine();
      }
    }
  }
}

먼저 UAC 폭탄을 받았는지 확인했습니다.

System.UnauthorizedAccessException : 'c : \ program files \ test.txt'경로에 대한 액세스가 거부되었습니다.
// 등 ..

그런 다음 다음 구문을 사용하여 ConsoleApplication1에 매니페스트를 추가했습니다.

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

No bomb. And a file I can't easily delete :) This is consistent with several previous tests on various machines running Vista and Win7. The started program inherits the security token from the starter program. If the starter has acquired admin privileges, the started program has them as well.


Here is an example of run process as administrator without Windows Prompt

  Process p = new Process();
  p.StartInfo.FileName = Server.MapPath("process.exe");
  p.StartInfo.Arguments = "";
  p.StartInfo.UseShellExecute = false;
  p.StartInfo.CreateNoWindow = true;
  p.StartInfo.RedirectStandardOutput = true;
  p.StartInfo.Verb = "runas";
  p.Start();
  p.WaitForExit();

You probably need to set your application as an x64 app.

The IIS Snap In only works in 64 bit and doesn't work in 32 bit, and a process spawned from a 32 bit app seems to work to be a 32 bit process and the same goes for 64 bit apps.

Look at: Start process as 64 bit


Use this method:

public static int RunProcessAsAdmin(string exeName, string parameters)
    {
        try {
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
            startInfo.UseShellExecute = true;
            startInfo.WorkingDirectory = CurrentDirectory;
            startInfo.FileName = Path.Combine(CurrentDirectory, exeName);
            startInfo.Verb = "runas";
            //MLHIDE
            startInfo.Arguments = parameters;
            startInfo.ErrorDialog = true;

            Process process = System.Diagnostics.Process.Start(startInfo);
            process.WaitForExit();
            return process.ExitCode;
        } catch (Win32Exception ex) {
            WriteLog(ex);
            switch (ex.NativeErrorCode) {
                case 1223:
                    return ex.NativeErrorCode;
                default:
                    return ErrorReturnInteger;
            }

        } catch (Exception ex) {
            WriteLog(ex);
            return ErrorReturnInteger;
        }
    }

Hope it helps.


 Process proc = new Process();                                                              
                   ProcessStartInfo info = 
                   new ProcessStartInfo("Your Process name".exe, "Arguments");
                   info.WindowStyle = ProcessWindowStyle.Hidden;
                   info.UseShellExecute =true;
                   info.Verb ="runas";
                   proc.StartInfo = info;
                   proc.Start();

참고URL : https://stackoverflow.com/questions/2532769/how-to-start-a-process-as-administrator-mode-in-c-sharp

반응형