2016-04-29 19 views
0

我正在編寫一個非常基本的程序(vb),它將一些文件從一個文件夾複製到一個程序文件文件夾,因此我必須使用所需的管理員權限因爲asInvoker不允許我在程序文件夾中寫入程序。 現在,我複製文件後,我調用自動創建的腳本來自動設置外部程序中的這些文件,因爲我有腳本調用外部程序並啓動自動化過程。調用外部程序作爲標準用戶從必需的管理員程序運行

創建文件並將文件複製到「結束」程序的程序正常運行。 調用「結束」程序並執行自動設置的腳本也適用。

我的問題是,當我將它們組合起來的2, 出於某種奇怪的原因「結束」程序(我沒寫,也有我的SORCE代碼)時,作爲管理員身份運行erraticly behives。 如果我右鍵單擊並以管理員身份運行,程序不會讀取數據庫或所需文件返回錯誤並自行終止。因此,以管理員身份運行不是一個選項。 但是,由於我的程序必須以管理員身份運行,因此它看起來像將同樣的特權配置爲以admin身份調用「結束」程序的autoit腳本。 如果我從我的應用程序而不是自動腳本調用「結束」程序,也會發生這種情況。

因此,在它調用autoit腳本或「結束」程序之前,我們的應用程序從管理員降級到標準用戶之後,以便「結束」程序不作爲管理員運行或一個參數,特別是使應用程序作爲標準用戶調用外部程序,btw我使用Process.start(「autoitscript.exe」)來調用它。 或任何其他解決方法,我可以嘗試。 這不涉及自動腳本來調用「結束」程序和我的應用程序,因爲這有效,但不是我的意圖。

謝謝。

回答

0

這是執行一項棘手的任務,但這個怎麼樣:

  1. 讓你的應用程序啓動asInvoker,不顯示任何窗口,並檢查它是否與使用此代碼提升的權限運行:

    Public Shared Function IsAdministrator() As Boolean 
        Return (New WindowsPrincipal(WindowsIdentity.GetCurrent())).IsInRole(WindowsBuiltInRole.Administrator) 
    End Function 
    

    如果它不以提升的權限運行,使其啓動隱形cmd例如,您重定向標準輸入。

  2. 獲取cmd進程的PID,現在使用提升的權限啓動應用程序的新實例(可以通過設置StartInfo.Verb = "runas"來完成),並將PID作爲命令行參數傳遞。

  3. 現在您的應用程序的新實例啓動,IsAdministrator()應返回True

    因此,現在您知道您的應用具有管理員權限,您可以檢查該應用是否具有可解析爲Integer的命令行參數。如果是這樣,將Integer存儲在某個地方,然後執行所有管理員所需的工作。

  4. 最後,如果您想要啓動autoitscript.exe應用程序,您可以創建一個過程變量並將其分配給Process.GetProcessById(<your PID Integer here>)

    例如:

    Dim cmdProcess As Process = Process.GetProcessById(cmdPID) 
    
  5. 現在你已經在CMD實例控制再次你只寫它的標準輸入(this article介紹一點它是如何工作)。

    你想寫兩行。首先是啓動其他應用:

    autoitscript.exe 
    

    ,第二個是關閉CMD例如:

    exit 
    

如果有什麼不清楚只是讓我知道。

相關問題