2017-03-21 48 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。 Befor此,我用bat文件:

@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

哪裏是我的問題嗎?

+1

用戶應該知道管理員憑據以管理員身份運行應用程序。如果你打算替換他們,那麼首先會否定管理員帳戶的全部要點。最好的辦法是1.要求用戶輸入憑證(最好)或2.將憑證保存到加密文件中並加載(只允許管理員更改文件)。 – TheLethalCoder

+0

謝謝。第二個解決方案對我來說更好。 @TheLethalCoder你能幫我找到我該怎麼做的嗎? –

+0

不,這不是一個代碼寫入服務。嘗試自己動手,然後回過頭來問問一個新的具體問題,如果你有問題,並提供一個[MCVE]。 – TheLethalCoder

回答

0

試試這個。在您的項目中添加應用程序清單文件。然後在清單文件中添加下面的行。

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

雖然在Visual Studio中工作時,右鍵單擊項目 - >添加新項,然後選擇應用程序清單文件添加應用程序清單文件

+0

我試過這個,但用戶不應該知道管理員密碼。我希望用戶名和密碼被自動替換 –

0

什麼工作是冒充管理員用戶在程序中,然後作爲管理員用戶模擬時啓動外部進程。

交互式用戶仍然會看到一個UAC確認(除非您的應用程序已經以提升的權限運行),但他們不必輸入憑證,只需點擊「確定」,模擬管理員用戶的憑證將會用過的。

使用下面的代碼:

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(); 

請注意,您必須使用UseShellExecute = false

相關問題