2017-03-21 1 views
1

상황에 맞는 메뉴를 통해 관리자 권한으로 만 실행되는 프로그램이 있습니다. 로컬 관리자의 자격 증명을 사용하여 응용 프로그램을 실행하는 스크립트는 어떻게 만듭니 까?사용자 이름과 비밀번호를 사용하여 관리자 권한으로 앱을 실행하는 방법

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     //copy from 
     string sourcePath = @"\\10.11.11.4\Links\"; 
     //copy to 
     string targetPath = @"e:\RainbowPlus\Links\"; 
     if (!Directory.Exists(targetPath)) 
     { 
      Directory.CreateDirectory(targetPath); 
     } 
     foreach (var srcPath in Directory.GetFiles(sourcePath)) 
     { 

      File.Copy(srcPath, srcPath.Replace(sourcePath, targetPath), true); 
     } 

     ProcessStartInfo ps = new ProcessStartInfo(); 

     ps.FileName = @"C:\Program Files\WinRAR\RAR.exe"; 
     //unrar and overwrite to 
     ps.Arguments = @"x -o+ e:\RainbowPlus\Links\Links.rar e:\RainbowPlus\Links\"; 
     Process.Start(ps); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     Process proc = new Process 
     { 
      StartInfo = 
     { 
      CreateNoWindow = true, 
      UseShellExecute = true, 
      RedirectStandardOutput = true, 
      RedirectStandardInput = true, 
      FileName = @"E:\\RainbowPlus\\Rainbowplus.exe", 
      UserName = "username", 
      Domain = "my.domain", 
      Password = GetSecureString("secretpassword"), 
      Arguments = "" 
     } 
     }; 
     //proc.Start(); 
     Process p = new Process(); 
     p.StartInfo.Verb = "runas"; 
     System.Diagnostics.Process.Start("E:\\RainbowPlus\\Rainbowplus.exe"); 

    } 

    public static SecureString GetSecureString(string str) 
    { 
     SecureString secureString = new SecureString(); 
     foreach (char ch in str) 
     { 
      secureString.AppendChar(ch); 
     } 
     secureString.MakeReadOnly(); 
     return secureString; 
    } 

을하지만 난 여전히 UAC의 PROMT 있습니다

은 내가 무엇을 가지고. 내 문제가

@echo off 
 

 
REM Check runing program #### 
 

 
Set ProcessName=rainbowplus.exe 
 
TaskList /FI "ImageName EQ %ProcessName%" | Find /I "%ProcessName%" 
 
If %ErrorLevel%==0 (echo Close rainbow program) else (goto testnetwork) 
 
pause 
 
exit 
 

 
REM Network testing 
 

 
:testnetwork 
 
echo Testing network 
 
pause 
 
ping -n 4 10.11.11.4 | find "TTL=" > nul 
 
if %errorlevel%==0 (goto copy) else (echo Network down) 
 
pause 
 
exit 
 

 
REM Copy files 
 

 
:copy 
 
echo Updating files 
 
pause 
 
xcopy "\\10.11.11.4\Links" "E:\RainbowPlus\Links" /i /q /e /y /h /c 
 
if %errorlevel%==0 (goto startprogram) else (goto error) 
 
:startprogram 
 
echo Succsess 
 
pause 
 
runas.exe /env /profile /savecred /user:"comp5234\Administrator" "E:\RainbowPlus\RainbowPlus.exe" 
 
exit 
 
:error 
 
echo Files was not updated 
 
pause 
 
exit

입니다 :이 befor을 , 나는 박쥐 파일을 사용할 수 있습니까?

+1

사용자가 관리자로 앱을 실행하려면 관리자 자격증 명을 알아야합니다. 당신이 그 (것)들을 그 후에 그 후에 대체하기 위하여려고하는 경우에 첫번째 장소에있는 관리 계정이있는의 모든 점을 부정하십시오. 가장 좋은 방법은 1. 사용자가 자격 증명 (최상)을 입력하도록 요구하거나 2. 자격 증명을 암호화 된 파일에 저장 한 다음 (관리자 만 파일을 변경하도록 허용)에로드합니다. – TheLethalCoder

+0

감사합니다. 두 번째 해결책은 나를 위해 더 좋아 보인다. @ TheLethalCoder 내가 어떻게 할 수 있니? –

+0

아니요 코드 작성 서비스가 아닙니다. 직접 시도하고 직접 해보고 문제가 발생하면 새로운 특정 질문을하고 [MCVE]를 제공하십시오. – TheLethalCoder

답변

0

시도해보십시오. 프로젝트에 응용 프로그램 매니페스트 파일을 추가하십시오. 그런 다음 아래 줄을 매니페스트 파일에 추가하십시오. > 새 항목을 추가 한 후 작동 무엇

+0

나는 이것을 시도했지만 사용자는 관리자 암호를 알아야합니다. 자동으로 사용자 이름과 암호를 대체하고 싶습니다. –

0

이 프로그램에서 다음 관리자 사용자를 가장하는 것입니다 응용 프로그램 매니페스트 파일을 추가하는 응용 프로그램 매니페스트 파일을 선택 - 비주얼 스튜디오에서 작업하는 동안

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

, 바로 프로젝트를 클릭 관리자로 가장하는 동안 외부 프로세스를 시작하십시오.

대화 형 사용자는 응용 프로그램이 이미 높은 권한으로 실행중인 경우를 제외하고 UAC 확인을 계속 볼 수 있지만 자격 증명을 입력 할 필요가 없으며 "확인"을 클릭하면 가장 된 관리자의 자격 증명이 익숙한. 당신이 UseShellExecute = false를 사용할 필요가

private void Impersonate() 
{ 
    IntPtr token = IntPtr.Zero; 
    if (LogonUser("adminusername", "", "Password", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, out token)) 
    { 
     throw new Win32Exception(); 
    } 

    WindowsIdentity.Impersonate(token); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    Impersonate(); 
    try 
    { 
     Process process = new Process(); 
     process.StartInfo.FileName = "ABC.exe"; 
     process.StartInfo.UseShellExecute = false; 
     process.Start(); 
    } 
    finally 
    { 
     RevertToSelf(); 
    } 
} 

private const int LOGON32_LOGON_INTERACTIVE = 2; 
private const int LOGON32_PROVIDER_DEFAULT = 0; 

[DllImport("advapi32.dll", SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool LogonUser(
    [MarshalAs(UnmanagedType.LPStr)] string pszUserName, 
    [MarshalAs(UnmanagedType.LPStr)] string pszDomain, 
    [MarshalAs(UnmanagedType.LPStr)] string pszPassword, 
    int dwLogonType, 
    int dwLogonProvider, 
    out IntPtr phToken); 

[DllImport("advapi32.dll", SetLastError = true)] 
private static extern bool RevertToSelf(); 

참고 :

는 다음과 같은 소스 코드를 사용합니다.

관련 문제