Làm cách nào để chạy chương trình tự động với tư cách quản trị viên trên Windows 7 khi khởi động?


82

Tôi đã tạo ứng dụng kiểm soát của phụ huynh để theo dõi hoạt động của con mình. GUI duy nhất của ứng dụng là biểu tượng thanh tác vụ. Chương trình được cài đặt dưới dạng quản trị viên. Tôi muốn chương trình này được khởi động tự động với tư cách là người dùng quản trị khi khởi động Windows, để người dùng tiêu chuẩn không thể giết nó khỏi trình quản lý tác vụ.

Tôi có thể tạo khóa đăng ký tại:

HKLM\Software\Microsoft\Windows\CurrentVersion\Run

để làm cho nó chạy tự động khi Windows khởi động. Vấn đề là chương trình được khởi động với tư cách người dùng đã đăng nhập (tiêu chuẩn).

Làm cách nào để làm cho nó chạy ở chế độ nâng cao? Điều này có thể xảy ra trong Win7 không?


1
Một vấn đề có lẽ lớn hơn là chương trình hoàn toàn không được khởi động nếu không có người dùng đã đăng nhập. Đây là một cơ chế để chạy một chương trình khi đăng nhập (như .logintập lệnh của bạn trên Unix), chứ không phải chạy lúc khởi động (như một số /etc/rc/...tập lệnh).
Kaz

@Kaz: Trong bối cảnh của câu hỏi này, điều đó dường như không phải là một vấn đề (trừ khi cố gắng để quan sát sự tương tác đứa trẻ với màn hình đăng nhập)
Ben Voigt

Câu trả lời:


61

Bạn cần phải cắm nó vào bộ lập lịch tác vụ, sao cho nó được khởi chạy sau khi người dùng đăng nhập, sử dụng tài khoản người dùng có quyền truy cập quản trị trên hệ thống, với các đặc quyền cao nhất dành cho các quy trình do tài khoản đó khởi chạy.

Đây là phần triển khai được sử dụng để tự động khởi động lại các quy trình với đặc quyền quản trị khi đăng nhập với tư cách người dùng bình thường.

Tôi đã sử dụng nó để khởi chạy quy trình trợ giúp 'OpenVPN GUI' cần các đặc quyền nâng cao để hoạt động chính xác và do đó sẽ không khởi chạy đúng cách từ khóa đăng ký.

Từ dòng lệnh, bạn có thể tạo tác vụ từ mô tả XML về những gì bạn muốn hoàn thành; vì vậy, ví dụ như chúng tôi có cái này, được xuất từ ​​hệ thống của tôi, sẽ bắt đầu notepad với các đặc quyền cao nhất khi tôi đăng nhập:

<?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>

và nó được đăng ký bởi dấu nhắc lệnh của quản trị viên bằng cách sử dụng:

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

câu trả lời này thực sự nên được chuyển sang một trong các trang web stackexchange khác, vì nó thực sự không phải là một câu hỏi lập trình.


Cảm ơn bạn rất nhiều cho các thông tin. Tôi sẽ thử nó và xem nó hoạt động như thế nào.
newman

1
"sau khi đăng nhập của người dùng" không phải là "khởi động Windows".
Kaz

Có, nhưng bạn không thực sự có một máy tính để bàn để sử dụng cho đến khi bạn đã đăng nhập
Petesh

6
@Petesh làm cách nào để bạn có được một ứng dụng dựa trên giao diện người dùng để chạy theo cách này? Khi tôi sử dụng Lịch biểu tác vụ, tôi có thể chạy một ứng dụng nhưng tôi không thấy giao diện người dùng của nó.
gonzobrains

Tôi đã tự hỏi nếu có bất kỳ cách nào để làm điều này thông qua các thay đổi đăng ký. Nếu có, nó có thể được lên lịch ngay cả khi không (trước) khởi động hệ điều hành.
Sopalajo de Arrierez,

40
schtasks /create /sc onlogon /tn MyProgram /rl highest /tr "exeFullPath"

2
Nó sẽ chạy trong phiên 0 và bạn sẽ không thể nhìn thấy giao diện người dùng ?? Tôi muốn điều tương tự và nó đã làm điều đó nhưng nó đã chạy trong phiên 0 dưới tên người dùng của tôi và do đó giao diện người dùng không có sẵn
Gautam

4
"onlogon" không phải là Windows khởi động.
Kaz

1
Trên Windows 7, nó chạy trên màn hình nền của người dùng. Hãy thử nó với calc.exe.
Vladimir Panteleev 13/12/12

1
@CyberShadow Tôi đang cố gắng thực hiện việc này bằng một ứng dụng yêu cầu quyền quản trị viên. Tôi thấy nó trong trình quản lý tác vụ nhưng giao diện người dùng của nó không hiển thị.
gonzobrains

2
Cảm ơn vì câu trả lời. Gần đây, khoản nợ CNTT của chúng tôi đã buộc phải BẬT UAC thông qua chính sách nhóm cho tất cả các máy tính trên miền công ty của chúng tôi. Với hậu quả đáng buồn là nếu bạn chạy dấu nhắc lệnh với tư cách là quản trị viên, ánh xạ ổ đĩa của bạn sẽ không khả dụng. Trước đây, tôi đã thiết lập một tệp .bat ngắn để chạy khi đăng nhập thông qua khóa đăng ký "run" sẽ thiết lập tất cả ánh xạ ổ đĩa của tôi. Tôi cần một cách chạy .bat tương tự cho tài khoản SYSTEM khi khởi động. "schtasks / ru SYSTEM" là chính xác những gì tôi cần.
Chết ở Sente vào

15

Điều này là không thể.
Tuy nhiên, bạn có thể tạo một dịch vụ chạy dưới quyền người dùng quản trị.

Dịch vụ có thể chạy tự động khi khởi động và giao tiếp với ứng dụng hiện có của bạn.
Khi ứng dụng cần làm điều gì đó với tư cách là quản trị viên, ứng dụng có thể yêu cầu dịch vụ thực hiện điều đó.

Hãy nhớ rằng nhiều người dùng có thể được đăng nhập cùng một lúc.


cảm ơn bạn rất nhiều cho câu trả lời nhanh chóng. Trên thực tế, tôi đã cố chạy ứng dụng từ Dịch vụ cửa sổ, nhưng không thể làm cho nó hoạt động. Tôi có thể thấy chương trình trong trình quản lý tác vụ (với tư cách là người dùng HỆ THỐNG), nhưng biểu tượng không hiển thị trên thanh tác vụ. Khi tôi thêm Verb = "runas" vào StartInfo, tôi gặp một ngoại lệ "Không có đủ bộ nhớ để xử lý lệnh này". Tôi đoán đó có thể là do không có cách nào để bật lên GUI để yêu cầu người dùng xác nhận.
newman

8
@miliu: Một dịch vụ không thể tương tác với người dùng. Bạn cần tạo hai chương trình giao tiếp với nhau.
SLaks

6

Tôi nghĩ rằng việc sử dụng bộ lập lịch tác vụ để tự động khởi động chương trình không thân thiện với người dùng lắm và đôi khi nó có tác dụng phụ đối với tôi (ví dụ: biểu tượng khay cho một chương trình không được thêm vào).

Để khắc phục điều này, tôi đã tạo một chương trình có tên là Khởi động nâng cao, trước tiên nó tự khởi chạy lại với đặc quyền của quản trị viên, sau đó nó khởi chạy tất cả các tệp trong một thư mục. Kể từ khi khởi động nâng cao hiện đã được nâng cao, tất cả các chương trình mà nó khởi chạy sau đó cũng được cấp đặc quyền quản trị viên. Thư mục nằm trên menu bắt đầu bên cạnh thư mục Khởi động cổ điển và hoạt động rất giống nhau.

Bạn có thể gặp một hộp thoại UAC khi chương trình tự khởi chạy lại, tùy thuộc vào cài đặt UAC của bạn.

Bạn có thể tải chương trình tại đây: https://stefansundin.github.io/eleisedstartup/


vì đây là câu trả lời gần đây, tôi muốn thêm một bình luận. Tôi đang cố gắng thực hiện tương tự như OP với chương trình của mình bằng cách sử dụng bộ lập lịch tác vụ trên Windows 10. Tuy nhiên, nó khởi động chương trình của tôi dưới dạng quy trình nền không phải là điều tôi muốn. Tôi muốn ứng dụng của mình bắt đầu bình thường với tư cách là quản trị viên. Chương trình của bạn có tài khoản cho điều này?
ThN

Tôi tin rằng nó sẽ làm được. Chương trình sẽ bắt đầu như thể bạn nhấp chuột phải vào phím tắt và sử dụng "Chạy với đặc quyền của quản trị viên". Nếu nó không hoạt động như bạn muốn, tôi rất vui khi biết thêm về trường hợp sử dụng của bạn và làm cho chương trình hoạt động cho bạn.
stefansundin

3

Đặt tính tương thích của ứng dụng của bạn với quản trị viên (Run theprogram as an administrator).

Cắm nó vào task scheduler, sau đó tắt UAC.


Tôi cũng đang gặp vấn đề tương tự. Giao diện người dùng không hiển thị. Bất kỳ sự giúp đỡ
Senthil Muthiah

1
@SenthilMuthiah Đó là bởi vì chương trình của bạn được chạy như một quy trình nền chứ không phải là một ứng dụng. Điều tương tự đã xảy ra với tôi.
ThN

3

Bạn có thể thực hiện việc này bằng cách cài đặt tác vụ khi đang chạy với tư cách quản trị viên thông qua thư viện TaskSchedler . Ở đây tôi đang đưa ra giả định rằng .NET / C # là một nền tảng / ngôn ngữ phù hợp với các câu hỏi liên quan của bạn.

Thư viện này cung cấp cho bạn quyền truy cập chi tiết vào API Trình lập lịch tác vụ, vì vậy bạn có thể điều chỉnh các cài đặt mà bạn không thể đặt bằng cách khác thông qua dòng lệnh bằng cách gọi schtasks, chẳng hạn như mức độ ưu tiên của khởi động. Là một ứng dụng kiểm soát của phụ huynh, bạn sẽ muốn nó có mức ưu tiên khởi động là 0 (tối đa), schtasksưu tiên này sẽ tạo theo mặc định là 7.

Dưới đây là ví dụ mã về việc cài đặt tác vụ khởi động được định cấu hình đúng để chạy ứng dụng mong muốn với tư cách quản trị viên vô thời hạn khi đăng nhập. Mã này sẽ cài đặt một tác vụ cho chính quá trình mà nó đang chạy.

/*
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();
    }
}

Đó là một thư viện bóng bẩy - Tuy nhiên, chỉ cần một ghi chú. Hầu hết thời gian chạy một cái gì đó trong "thời gian thực" là không cần thiết. Và bạn không bao giờ vứt bỏ tdCảm ơn vì đã chỉ tôi theo hướng này.
Andy

1
@Sonic Cảm ơn bạn đã mách nước. Bạn nói đúng, "thời gian thực" thường không cần thiết. Mã này được sao chép từ một bộ lọc nội dung web mã nguồn mở mà tôi đã viết, vì vậy cần phải khởi động nó càng sớm càng tốt.

2

Một chương trình tôi đã viết, farmComm, có thể giải quyết vấn đề này. Tôi đã phát hành nó dưới dạng mã nguồn mở và Miền công cộng.

Nếu nó không đáp ứng tiêu chí của bạn, bạn có thể dễ dàng thay đổi nó để làm như vậy.

farmComm:

  • Chạy khi khởi động trong một dịch vụ, tiếp tục khi người dùng đăng nhập hoặc đăng xuất.
    • Trong phiên 0
    • Dưới người dùng "NT AUTHORITY \ SYSTEM."
  • Sinh ra các quy trình tùy ý (bạn chọn);
    • Cũng trong phiên 0
    • "Vô hình" hoặc không hiển thị bất kỳ giao diện người dùng / GUI nào
    • Với quyền truy cập vào phần cứng đồ họa (ví dụ: GPU).
    • Phản hồi phiên hoạt động, ngay cả khi nó thay đổi, bao gồm cả Màn hình nền an toàn. Đây là cách nó:
    • Chỉ tạo ra các quy trình sau khi người dùng không hoạt động trong 8,5 phút
    • Chấm dứt sinh sản khi người dùng tiếp tục từ chế độ rỗi

Các tập lệnh nguồn có sẵn ở đây:

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


2

Bạn cũng nên xem xét các tác động bảo mật của việc chạy quy trình với tư cách là người dùng cấp quản trị viên hoặc với tư cách là Dịch vụ. Nếu bất kỳ đầu vào nào không được xác thực đúng cách, chẳng hạn như nếu nó đang nghe trên giao diện mạng. Nếu trình phân tích cú pháp cho đầu vào này không xác thực đúng cách, nó có thể bị lạm dụng và có thể dẫn đến việc khai thác có thể chạy mã với tư cách người dùng nâng cao. trong ví dụ của abatishchev, nó không có nhiều vấn đề, nhưng nếu nó được triển khai trong môi trường doanh nghiệp, hãy thực hiện đánh giá bảo mật trước khi triển khai trên diện rộng.


Một số chương trình yêu cầu độ cao và không nhất thiết phải có vấn đề về bảo mật. Ví dụ: một chương trình theo dõi nhiệt độ hệ thống và hiển thị nó trong khu vực thông báo sẽ cần độ cao để truy cập vào phần cứng và nó sẽ cần được chạy tự động, tuy nhiên vấn đề bảo mật là một vấn đề cần quan tâm.
Synetech

-3

Tôi nghĩ rằng trình lập lịch tác vụ sẽ quá mức cần thiết (imho). Có một thư mục khởi động cho win7.

C: \ Users \ miliu \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ Startup

Chỉ cần tạo lối tắt cho Ứng dụng tự khởi động của bạn, chỉnh sửa các thuộc tính của lối tắt và để nó luôn chạy với tư cách quản trị viên.

Tất nhiên, con bạn có thể đóng nó lại, nhưng nếu chúng am hiểu về công nghệ, chúng luôn tìm cách để ngăn bạn ra ngoài. Tôi biết tôi đã làm khi tôi còn trẻ.

Chúc may mắn!


6
Điều này sẽ không hoạt động. Windows sẽ bỏ qua các phím tắt Khởi động được đặt để chạy với tư cách Quản trị viên.
Vladimir Panteleev

Có thật không? Bạn đã thử chưa? Bởi vì nó hoạt động tốt bên tôi. Tôi phải tự động khởi động LogitechSoundManager của mình với tư cách Quản trị viên để âm thanh vòm hoạt động ...
zhengtonic

Tôi cũng gặp sự cố này, mặc dù các phím tắt trong thư mục khởi động đã chọn tùy chọn "chạy với tư cách quản trị viên", chúng vẫn không tải khi khởi động. Bất cứ ai biết bất kỳ cách nào để khắc phục điều này?
ycomp

2
CyberShadow đã đúng khi UAC của máy tính bị tắt. StartUp phím tắt như admin không làm việc ... người ta phải sử dụng TaskScheduler
zhengtonic

Tôi thấy ít nhất trên Windows 10 điều này không hoạt động. Như @ vladimir-panteleev đã nói, Windows dường như bỏ qua nó.
E. van Putten
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.