2011-03-25 60 views
80

我創建了自己的家長控制應用程序來監視我的孩子的活動。該應用唯一的GUI是一個任務欄圖標。該程序以管理員身份安裝。我希望在Windows啓動時以管理員用戶身份自動啓動此程序,以便標準用戶無法從任務管理器中將其終止。如何在Windows啓動時以管理員身份自動運行程序?

我可以創建在註冊表項:

HKLM\Software\Microsoft\Windows\CurrentVersion\Run 

,使其在Windows啓動時自動運行。問題是程序以登錄(標準)用戶身份啓動。

如何讓它在高架模式下運行?這在Win7中完全可能嗎?

+1

一個也許更大的問題是,該計劃是*不*下開始的,如果在用戶登錄沒有。這是一種在登錄時運行程序的機制(如Unix上的'.login'腳本),而不是在啓動時運行(如某些'/ etc/rc/...'腳本)。 – Kaz 2012-12-06 22:08:24

+0

@Kaz:在這個問題的背景下,這似乎不是一個問題(除非試圖觀察孩子與登錄屏幕的交互) – 2015-09-11 04:34:58

回答

15

這是不可能的。
但是,您可以創建一個在管理用戶下運行的服務。

該服務可以在啓動時自動運行並與現有應用程序通信。
當應用程序需要以管理員身份執行某些操作時,它可以要求服務爲此執行此操作。

請記住,一次可以登錄多個用戶。

+0

非常感謝您的及時答覆。其實,我確實嘗試從Window Service運行應用程序,但無法使其工作。我可以在任務管理器中看到該程序(作爲SYSTEM用戶),但該圖標未顯示在任務欄中。當我將Verb =「runas」添加到StartInfo時,我收到了一個異常「沒有足夠的存儲空間可用於處理此命令」。我想這可能是因爲沒有辦法彈出一個GUI來要求用戶確認。 – newman 2011-03-25 02:24:25

+8

@ miliu:服務無法與用戶交互。你需要製作兩個互相溝通的程序。 – SLaks 2011-03-25 02:32:25

+0

+1,因爲這是'更清潔'的答案。 – deed02392 2013-05-26 13:46:55

56

您需要將其插入到任務計劃程序中,以便在用戶登錄後啓動它,並使用具有系統管理訪問權限的用戶帳戶,併爲該帳戶啓動的進程提供最高權限。

這是用於在以普通用戶身份登錄時使用管理權限自動啓動進程的實現。

我用它來啓動需要提升特權才能正常工作的'OpenVPN GUI'輔助進程,因此無法從註冊表項正確啓動。

從命令行中,您可以根據您想要完成的內容的XML描述創建任務;因此,例如,我們這一點,從我的系統中導出,當我登錄這將啓動具有最高權限的記事本:

<?xml version="1.0" encoding="UTF-16"?> 
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> 
    <RegistrationInfo> 
    <Date>2015-01-27T18:30:34</Date> 
    <Author>Pete</Author> 
    </RegistrationInfo> 
    <Triggers> 
    <LogonTrigger> 
     <StartBoundary>2015-01-27T18:30:00</StartBoundary> 
     <Enabled>true</Enabled> 
    </LogonTrigger> 
    </Triggers> 
    <Principals> 
    <Principal id="Author"> 
     <UserId>CHUMBAWUMBA\Pete</UserId> 
     <LogonType>InteractiveToken</LogonType> 
     <RunLevel>HighestAvailable</RunLevel> 
    </Principal> 
    </Principals> 
    <Settings> 
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> 
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries> 
    <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries> 
    <AllowHardTerminate>true</AllowHardTerminate> 
    <StartWhenAvailable>false</StartWhenAvailable> 
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> 
    <IdleSettings> 
     <StopOnIdleEnd>true</StopOnIdleEnd> 
     <RestartOnIdle>false</RestartOnIdle> 
    </IdleSettings> 
    <AllowStartOnDemand>true</AllowStartOnDemand> 
    <Enabled>true</Enabled> 
    <Hidden>false</Hidden> 
    <RunOnlyIfIdle>false</RunOnlyIfIdle> 
    <WakeToRun>false</WakeToRun> 
    <ExecutionTimeLimit>PT0S</ExecutionTimeLimit> 
    <Priority>7</Priority> 
    </Settings> 
    <Actions Context="Author"> 
    <Exec> 
     <Command>"c:\windows\system32\notepad.exe"</Command> 
    </Exec> 
    </Actions> 
</Task> 

,它的使用管理員命令提示符註冊:

schtasks /create /tn "start notepad on login" /xml startnotepad.xml 

這個答案應該真的轉移到其他stackexchange站點之一,因爲它本身並不是一個編程問題。

+0

非常感謝您的信息。我會嘗試一下,看看它是如何工作的。 – newman 2011-03-25 02:26:36

+1

「用戶登錄後」不是「Windows啓動」。 – Kaz 2012-12-06 22:08:45

+0

是的,但實際上沒有桌面可供使用,直到您登錄 – Petesh 2012-12-07 14:05:10

34
schtasks /create /sc onlogon /tn MyProgram /rl highest /tr "exeFullPath" 
+2

它不會在會話0中運行,並且您將無法看到UI? 我想同樣的事情,它做到了,但它在我的用戶名下的會話0中運行,因此UI不可用 – Gautam 2012-08-21 15:58:13

+3

「onlogon」不是Windows啓動。 – Kaz 2012-12-06 22:09:18

+1

在Windows 7上,它在用戶的桌面上運行。使用calc.exe進行試用。 – 2012-12-13 06:49:59

3

設置你的應用程序的兼容性管理員(Run theprogram as an administrator)。將其插入task scheduler,然後關閉UAC

+0

我也遇到了同樣的問題。用戶界面不可見。任何幫助 – 2013-10-11 07:30:06

+0

@SenthilMuthiah這是因爲你的程序作爲後臺進程而不是應用程序運行。同樣的事情發生在我身上。 – ThN 2015-06-18 18:51:46

2

我寫的一個程序farmComm可以解決這個問題。我將它作爲開源和公有領域發佈。

如果它不符合您的標準,您可能可以輕鬆修改它來執行此操作。

farmComm:

  • 運行在一個服務,當用戶登錄或註銷它繼續下開機。
    • 在會話0中
    • 在用戶「NT AUTHORITY \ SYSTEM」下。
  • 產生任意進程(你選擇);
    • 此外,在會話0
    • 「不可見地」,或不顯示任何用戶界面/ GUI
    • 通過訪問圖形硬件(例如,GPU)的。
    • 即使發生更改,也會響應活動會話,包括安全桌面。這是怎麼回事:在用戶空閒8.5分鐘
    • 終止產卵當用戶從空閒

恢復

  • 只有產生進程的源腳本都可以在這裏:

    https://github.com/r-alex-hall/farmComm

  • -3

    我認爲任務調度程序會過度殺傷(imho)。有一個啓動文件夾爲win7。

    C:\用戶\ miliu \應用程序數據\漫遊\微軟\的Windows \開始菜單\程序\啓動

    就爲您自動啓動一個應用的快捷方式,編輯快捷方式的屬性,讓它始終爲運行管理員。

    你的孩子當然可以關閉它,但如果他們精通技術,他們總會找到一種方法來阻止你。我知道我年輕時就做過。

    祝你好運!

    +5

    這不起作用。 Windows將忽略設置爲以管理員身份運行的啓動快捷方式。 – 2014-01-05 09:41:02

    +0

    真的嗎?你有沒有嘗試過?因爲它在我身邊工作得很好。我必須以管理員身份自動啓動我的LogitechSoundManager才能使環繞聲奏效...... – zhengtonic 2014-03-04 09:39:30

    +0

    當然我嘗試過。也許你的UAC被禁用? – 2014-03-04 11:48:25

    2

    您還應該考慮以管理員級別用戶或服務運行進程的安全含義。如果任何輸入未正確驗證,例如正在網絡接口上偵聽。如果此輸入的解析器未正確驗證,則可能會被濫用,並可能導致可能以高級用戶身份運行代碼的漏洞。在abatishchev的例子中,它應該不是什麼大問題,但是如果要部署在企業環境中,那麼在大規模部署之前要進行安全評估。

    +0

    某些程序需要提升並且不一定會出現安全問題。例如,一個監視系統溫度並將其顯示在通知區域的程序需要提升才能訪問硬件,並且需要自動運行,但安全性對它來說是一個切入點。 – Synetech 2016-02-10 18:20:36

    4

    我認爲使用任務計劃程序自動啓動程序不是非常用戶友好,有時它對我有副作用(例如,不添加程序的托盤圖標)。

    爲了解決這個問題,我創建了一個名爲Elevated Startup的程序,它首先用管理員權限重新啓動,然後啓動目錄中的所有文件。由於升級啓動現在升級,所以它啓動的所有程序也被授予管理員權限。該目錄位於傳統啓動目錄旁邊的開始菜單上,並且工作原理非常相似。

    當程序重新啓動時,您可能會遇到一個UAC對話框,具體取決於您的UAC設置。

    你可以在這裏的程序:https://stefansundin.github.io/elevatedstartup/

    +0

    既然這是最近的答案,我想添加評論。我正在嘗試使用Windows 10上使用任務計劃程序的程序執行與OP相同的操作。但是,它啓動我的程序作爲後臺進程,這不是我想要的。我希望我的應用程序以管理員身份正常啓動。你的程序是否解釋了這個問題? – ThN 2015-06-18 12:54:24

    +0

    我相信會的。程序啓動時應該像右鍵單擊快捷方式一樣,並使用「使用管理員權限運行」。如果它不像您想要的那樣行事,我很樂意更多地瞭解您的使用案例,並讓您的程序爲您工作。 – stefansundin 2015-06-18 22:06:18

    2

    您可以通過安裝任務,同時經由TaskSchedler library管理員運行做到這一點。我在這裏假設.NET/C#是一個適合您的相關問題的平臺/語言。

    該庫爲您提供了對任務計劃程序API的詳細訪問權限,因此您可以通過調用schtasks(例如啓動優先級)調整通過命令行無法設置的設置。作爲家長控制應用程序,您希望它的啓動優先級爲0(最大值),默認情況下schtasks的優先級爲7.

    下面是將正確配置的啓動任務安裝到在登錄時無限期地以管理員身份運行所需的應用程序。這段代碼將爲它運行的進程安裝一個任務。

    /* 
    Copyright © 2017 Jesse Nicholson 
    This Source Code Form is subject to the terms of the Mozilla Public 
    License, v. 2.0. If a copy of the MPL was not distributed with this 
    file, You can obtain one at http://mozilla.org/MPL/2.0/. 
    */ 
    
    /// <summary> 
    /// Used for synchronization when creating run at startup task. 
    /// </summary> 
    private ReaderWriterLockSlim m_runAtStartupLock = new ReaderWriterLockSlim(); 
    
    public void EnsureStarupTaskExists() 
    { 
        try 
        { 
         m_runAtStartupLock.EnterWriteLock(); 
    
    
         using(var ts = new Microsoft.Win32.TaskScheduler.TaskService()) 
         { 
          // Start off by deleting existing tasks always. Ensure we have a clean/current install of the task. 
          ts.RootFolder.DeleteTask(Process.GetCurrentProcess().ProcessName, false); 
    
          // Create a new task definition and assign properties 
          using(var td = ts.NewTask()) 
          { 
           td.Principal.RunLevel = Microsoft.Win32.TaskScheduler.TaskRunLevel.Highest; 
           // This is not normally necessary. RealTime is the highest priority that 
           // there is. 
           td.Settings.Priority = ProcessPriorityClass.RealTime; 
           td.Settings.DisallowStartIfOnBatteries = false; 
           td.Settings.StopIfGoingOnBatteries = false; 
           td.Settings.WakeToRun = false; 
           td.Settings.AllowDemandStart = false; 
           td.Settings.IdleSettings.RestartOnIdle = false;      
           td.Settings.IdleSettings.StopOnIdleEnd = false; 
           td.Settings.RestartCount = 0;      
           td.Settings.AllowHardTerminate = false; 
           td.Settings.Hidden = true; 
           td.Settings.Volatile = false; 
           td.Settings.Enabled = true; 
           td.Settings.Compatibility = Microsoft.Win32.TaskScheduler.TaskCompatibility.V2; 
           td.Settings.ExecutionTimeLimit = TimeSpan.Zero; 
    
           td.RegistrationInfo.Description = "Runs the content filter at startup."; 
    
           // Create a trigger that will fire the task at this time every other day 
           var logonTrigger = new Microsoft.Win32.TaskScheduler.LogonTrigger(); 
           logonTrigger.Enabled = true;      
           logonTrigger.Repetition.StopAtDurationEnd = false; 
           logonTrigger.ExecutionTimeLimit = TimeSpan.Zero; 
           td.Triggers.Add(logonTrigger); 
    
           // Create an action that will launch Notepad whenever the trigger fires 
           td.Actions.Add(new Microsoft.Win32.TaskScheduler.ExecAction(Process.GetCurrentProcess().MainModule.FileName, "/StartMinimized", null)); 
    
           // Register the task in the root folder 
           ts.RootFolder.RegisterTaskDefinition(Process.GetCurrentProcess().ProcessName, td); 
          } 
         }     
        } 
        finally 
        { 
         m_runAtStartupLock.ExitWriteLock(); 
        } 
    } 
    
    +0

    這是一個光滑的圖書館 - 只是一個筆記,但。在大多數情況下,「實時」運行並不是必要的。你永遠不會處理'td'謝謝你指示我朝這個方向發展。 – Andy 2017-02-17 15:02:00

    +1

    @Sonic謝謝你關於處置的提示。你是對的,「實時」通常不是必需的。此代碼是從我編寫的開放源代碼Web內容過濾器複製的,所以必須儘快啓動。 – 2017-02-23 18:07:46

    相關問題