我正在尝试延迟启动登录时加载的特定程序。根据这个问题,我应该能够使用任务计划程序来执行此操作。问题是,我在任何地方都找不到列出的程序。是否有我应该查看的特定窗格?该程序是 Razer Synapse,因此我认为它不会在 Microsoft 或 Western Digital 文件夹中。
如果它不在任务计划程序中,还有其他方法可以在启动时延迟它吗?
出于好奇,有多少种方法可以让程序在 Windows 启动时运行?
答案1
我无法在任何地方找到列出的程序。
有许多位置可用于在启动时运行程序。您需要检查所有位置,直到找到所需的程序。
有一些程序可以轻松检查启动位置。
在 Windows 中,有多少种方法可以使程序在启动时运行?
至少有 17 个位置可以启动程序。见下文。
Windows 程序自动启动位置
打开计算机后,将按以下顺序处理以下自动启动位置:
Windows 启动设备驱动程序
- 首先加载这些驱动程序,因为它们是存储设备等硬件正常运行所必需的。
- 启动设备驱动程序将位于以下注册表项下,且其起始值等于 0。
注册表项:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services
Windows 现在将执行各种任务,然后启动 Winlogon 进程。Winlogon 最终启动服务控制管理器,加载设置为自动启动的服务和驱动程序。
Windows 自动启动服务和驱动程序
- 服务控制管理器 (SCM) 进程 (\Windows\System32\services.exe) 现在将启动任何标记为 Start 值为 2 的服务或驱动程序。
注册表项:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services
运行一次服务
- 此键用于在计算机启动时启动服务。
- 这些条目在您登录后也可以继续运行,但必须在 HKEY_LOCAL_MACHINE...\RunOnce 注册表开始加载其程序之前完成。
注册表项:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
运行服务
- 此键也用于启动服务。
- 这些条目在您登录后也可以继续运行,但必须在 HKEY_LOCAL_MACHINE...\RunOnce 注册表开始加载其程序之前完成。
注册表项:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices
屏幕上显示 Windows 登录提示。用户登录后,继续按其余键。
通知
- 此键用于添加在特定事件发生时运行的程序。
- 事件包括登录、注销、启动、关机、启动屏幕保护程序和停止屏幕保护程序。
- 当 Winlogon.exe 生成上述事件时,Windows 将在 Notify 注册表项中查找可处理该事件的 DLL。
- 据了解,恶意软件会使用这种方法在用户登录计算机时自行加载。以这种方式加载可使恶意软件程序以一种难以停止的方式加载。
注册表项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify
UserInit 键
- 此项指定用户登录 Windows 后应立即启动哪个程序。
- 该键的默认程序是 C:\windows\system32\userinit.exe。Userinit.exe 是一个为您的用户名恢复配置文件、字体、颜色等的程序。
可以添加更多将从此键启动的程序,方法是用逗号分隔程序。例如:
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit =C:\windows\system32\userinit.exe,c:\windows\badprogram.exe。
这将使两个程序在您登录时启动,并且是木马、劫持程序和间谍软件的常见启动位置。注册表项:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit
壳牌价值
- 该值包含 Userinit.exe 将启动的逗号分隔值的列表。
- Windows 的默认 shell 是 explorer.exe,尽管已经进行了合法的替换。当 userinit.exe 启动 shell 时,它将首先启动在 HKEY_CURRENT_USER 中找到的 Shell 值。如果此值不存在,它将启动在 HKEY_LOCAL_MACHINE 中找到的值。
注册表项:HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\\Shell HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\\Shell
现在将处理其余的自动启动位置。
RunOnce 本地机器密钥
- 这些键主要供安装程序使用。
- 这些键中的条目启动一次,然后从键中删除。
- 如果键值前面有感叹号,则该条目在程序完成之后才会被删除,否则将在程序运行之前被删除。这很重要,因为如果不使用感叹号,并且此键中引用的程序无法完成,它将不会再次运行,因为它已被删除。
- 此项中的所有条目均以未定义的顺序同步启动。
- 因此,必须先完成此项中的所有程序,然后才能加载 HKEY_LOCAL_MACHINE...\Run、HKEY_CURRENT_USER...\Run、HKEY_CURRENT_USER...\RunOnce 和 Startup Folders 中的任何条目。
- 在 Windows 2000 和 Windows XP 的安全模式下,RunOnce 键会被忽略。Windows NT 3.51 不支持 RunOnce 键。
注册表项:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnceEx
跑步
- 这些是安装自动启动程序的最常见启动位置。
- 默认情况下,这些键不会在安全模式下执行。如果在这些键的值前面加上星号 *,它将在安全模式下运行。
注册表项:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
所有用户启动文件夹
- 对于 Windows XP、2000 和 NT,此文件夹用于存储所有登录此计算机的用户应自动启动的程序。
它通常位于:
Windows XP
C:\Documents and Settings\All Users\Start Menu\Programs\Startup
视窗系统
C:\wont\Profiles\All Users\Start Menu\Programs\Startup
Windows 2000
C:\Documents and Settings\All Users\Start Menu\Programs\Startup
用户配置文件启动文件夹
- 此文件夹将为登录的特定用户执行。
该文件夹通常位于:
- 操作系统
c:\windows\start menu\programs\startup
- Windows XP
C:\Documents and Settings\LoginName\Start Menu\Programs\Startup
RunOnce 当前用户密钥
- 这些键主要供安装程序使用。
- 这些键中的条目启动一次,然后从键中删除。
- 如果键值前面有感叹号,则该条目将在程序完成后才被删除,否则将在程序运行前被删除。这很重要,因为如果不使用感叹号,并且此键中引用的程序无法完成,它将不会再次运行,因为它已被删除。
- 在安全模式下,Windows 2000 和 Windows XP 会忽略 RunOnce 键。
- Windows NT 3.51 不支持 RunOnce 键。
注册表项:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
探索者运行
- 这些键通常用于作为计算机或用户上设置的策略的一部分来加载程序。
注册表项:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
加载键
- 此键不再常用,但可用于自动启动程序。
注册表项:HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\load
AppInit_DLL 库
- 该值对应于通过 AppInit_DLLs 注册表值加载的文件。
- AppInit_DLLs 注册表值包含在加载 user32.dll 时将加载的 dll 列表。
- 由于大多数 Windows 可执行文件都使用 user32.dll,这意味着 AppInit_DLLs 注册表项中列出的任何 DLL 也将被加载。这使得删除 DLL 变得非常困难,因为它将在多个进程中加载,其中一些进程无法停止,否则会导致系统不稳定。
- user32.dll 文件还被系统在您登录时自动启动的进程使用。这意味着,AppInit_DLLs 值中加载的文件将在 Windows 启动例程的很早阶段加载,从而允许 DLL 在我们访问系统之前隐藏或保护自己。
注册表项:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows
ShellServiceObjectDelayLoad
- 此注册表值包含的值与 Run 键的值类似。
- 不同之处在于,它不是指向文件本身,而是指向 CLSID 的 InProcServer,其中包含有关正在使用的特定 DLL 文件的信息。
- 计算机启动时,Explorer.exe 会自动加载此键下的文件。由于 Explorer.exe 是计算机的外壳,因此它会始终启动,从而始终加载此键下的文件。因此,这些文件会在启动过程的早期加载,在发生任何人工干预之前。
注册表项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad
共享任务调度器
- 本节对应于通过 XP、NT、2000 机器的 SharedTaskScheduler 注册表值加载的文件。
- 当您启动 Windows 时,此注册表值中的条目会自动运行。
注册表项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SharedTaskScheduler
以下是程序可以在启动时自动启动的文件:
- 自动执行脚本
- 系统配置目录
- windir\wininit.ini — 通常由安装程序使用,文件运行一次然后被删除。
- windir\启动工具
- windir\win.ini-[windows]“加载”
- windir\win.ini-[windows]“运行”
- windir\system.ini-[启动]“shell”
- windir\system.ini — [启动]“scrnsave.exe”
- windir\dosstart.bat — 在 Win95 或 98 中在关机菜单中选择“以 MS-DOS 模式重新启动”时使用。
- windir\系统\自动执行文件
- windir\系统\配置信息
免责声明
我与 SysInternals、Nirsoft 或 WinPatrol 没有任何关系,我只是该软件的最终用户。
答案2
如果您的程序在任务计划程序中不可用,那么它可能驻留在文件Registry
夹中startup
,或作为后台服务运行。
启动文件夹的位置全部用户如下:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
启动文件夹的位置当前用户如下:
C:\Users\Username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
启动注册表的位置全部用户如下:
HKLM\Software\Microsoft\Windows\CurrentVersion\Run
HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce
启动注册表的位置当前用户如下:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce
一旦找到您的程序名称,您就可以安全地禁用它,并在其中创建新任务Task Scheduler
并根据需要延迟它。
如果您无法在上述位置找到您的程序,则它可能位于服务控制台中。点击开始按钮并输入services.msc
获取服务管理控制台,您将在那里找到您的程序。
您可以下载自动运行来自 Microsoft 的 SysInternal 套件并亲自检查一大堆启动程序。
答案3
我创建了一个批处理文件来查找 vbs 恶意软件的位置并从 stratup 文件夹中获取其代码源:
@echo off
cls & color 9E & Mode 95,5
Title Running Processes - Scheduled Tasks - Services - Startup items by Hackoo 2020
If [%1] NEQ [Admin] Goto RunAsAdmin
echo(
echo( ===========================================================
echo( Please wait a while ... Working is in progress....
echo( ===========================================================
Set "Filter_Ext=%Temp%\Filter_Ext"
Call :GetFileNameWithDateTime MyDate
Set "Log=%~dpn0_%Computername%_%MyDate%.txt"
Set "Lnk_Target_Path_Log=%~dp0Lnk_Target_Path_Log.txt"
Set "All_Users=%ProgramData%\Microsoft\Windows\Start Menu\Programs\Startup"
Set "Current_User=%UserProfile%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup"
set "Winlogonkey=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
Set StartupFolders="%All_Users%" "%Current_User%"
If Exist "%Log%" Del "%Log%"
Set "VbsFile=%Tmp%\%~n0.vbs"
Call :Generate_VBS_File
Powershell ^
Get-WmiObject Win32_Process ^
| where commandline -NE $null ^
| Select-Object ProcessID,Name,CommandLine ^
| Out-String -Width 450 ^
| Findstr /I /V "Admin" ^
| Findstr /I /V "Get-WmiObject" ^
| Out-File "%Log%" -Encoding ASCII
Powershell ^
Get-CimInstance Win32_StartupCommand ^
| Select-Object Name,command,Location,user ^
| Format-List ^
| Out-File -Append "%Log%" -Encoding ASCII
>"%Lnk_Target_Path_Log%" (
@For %%A in (%StartupFolders%) Do (
Call :Execute_VBS_File "%%~A"
)
)
>> "%Log%" (Type "%Lnk_Target_Path_Log%")
> "%Filter_Ext%" (
echo .vbs
echo .vbe
echo .js
echo .jse
echo .hta
echo .bat
echo .cmd
echo .ps1
)
@for /f "delims=" %%a in ('Type "%Lnk_Target_Path_Log%" ^| Findstr /I /G:"%Filter_Ext%"') do (
@for /f "tokens=2 delims==" %%b in ('echo %%a') do (
>> "%Log%" 2>&1 (
echo(
echo ===================================================================================
echo( Source code of TargetPath=%%b
echo ===================================================================================
Type %%b
)
)
)
Del "%Filter_Ext%" /F >nul 2>&1
Del "%Lnk_Target_Path_Log%" >nul 2>&1
SetLocal EnableDelayedExpansion
>> "%Log%" (
echo(
echo ****************************************************************************************************
echo( No Microsoft Scheduled Tasks List
echo ****************************************************************************************************
@For /F "tokens=2,9,17,19,20,21,22 delims=," %%a in ('SCHTASKS /Query /NH /FO CSV /V ^|find /I /V "Microsoft" ^|findstr /I /C:"VBS" /C:"EXE"') do (
Set TaskName=%%~a
Set TaskPath=%%~b
Call :Trim_Dequote !TaskName! TaskName
Call :Trim_Dequote !TaskPath! TaskPath
echo "!TaskName!"
echo "!TaskPath!"
echo %%c;%%d;%%f;%%g
echo( ---------------------------------------------------------------------------------------------------
)
)
>> "%Log%" (
echo(
echo ****************************************************************************************************
echo( No Microsoft Services List
echo ****************************************************************************************************
@for /f "tokens=*" %%a in (
'WMIC service where "Not PathName like '%%Micro%%' AND Not PathName like '%%Windows%%'" get Name^,DisplayName^,PathName^,Status'
) do (
@for /f "delims=" %%b in ("%%a") do (
echo %%b
)
)
)
>> "%Log%" (
echo(
echo ****************************************************************************************************
Reg Query "%Winlogonkey%" | find /I "userinit"
)
If Exist "%Log%" Start /MAX "Log" "%Log%" & Exit
::-----------------------------------------------------------------------------------
:Trim_Dequote <Var> <NewVar>
(
echo Wscript.echo Trim_Dequote("%~1"^)
echo Function Trim_Dequote(S^)
echo If Left(S, 1^) = """" And Right(S, 1^) = """" Then Trim_Dequote = Trim(Mid(S, 2, Len(S^) - 2^)^) Else Trim_Dequote = Trim(S^)
echo End Function
)>"%VbsFile%"
for /f "delims=" %%a in ('Cscript //nologo "%VbsFile%"') do (
set "%2=%%a"
)
Del "%VbsFile%" /F >nul 2>&1
exit /b
REM ------------------------------------------------------------------------------
:GetFileNameWithDateTime <FileName>
for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set "MyDate=%%x"
set "%1=%MyDate:~0,4%-%MyDate:~4,2%-%MyDate:~6,2%-%MyDate:~8,2%-%MyDate:~10,2%"
Exit /B
REM -----------------------------------------------------------------------------
:Generate_VBS_File
>"%VbsFile%" (
echo Option Explicit
echo Dim Ws,objStartFolder,objFSO,objFolder,colFiles
echo Dim objFile,strFilePath,Lnk,Title
echo Title = "Extracting Target Path from .lnk and .url files by Hackoo 2020"
echo Set Ws = CreateObject("Wscript.Shell"^)
echo If WSH.Arguments.Count = 0 Then MsgBox "Missing Arguments",vbExclamation,Title : Wscript.Quit(1^)
echo objStartFolder = WSH.Arguments(0^)
echo Set objFSO = CreateObject("Scripting.FileSystemObject"^)
echo Set objFolder = objFSO.GetFolder(objStartFolder^)
echo Set colFiles = objFolder.Files
echo For Each objFile in colFiles
echo strFilePath = objFile.Path
echo If Ucase(objFSO.GetExtensionName(strFilePath^)^) = "LNK"_
echo Or Ucase(objFSO.GetExtensionName(strFilePath^)^) = "URL" Then
echo Call ExtractTargetPath(strFilePath^)
echo End If
echo Next
echo '-------------------------------------------------------------
echo Sub ExtractTargetPath(Lnk^)
echo set Lnk = Ws.Createshortcut(Lnk^)
echo WScript.echo "Link="^& DblQuote(Lnk^) ^& vbcrlf ^&_
echo "Target="^& DblQuote(Lnk.TargetPath^) ^& vbcrlf ^&_
echo String(100,"-"^)
echo End Sub
echo '-------------------------------------------------------------
echo Function DblQuote(Str^)
echo DblQuote = Chr(34^) ^& Str ^& Chr(34^)
echo End Function
echo '-------------------------------------------------------------
)
Exit /B
REM -----------------------------------------------------------------------------
:Execute_VBS_File
cscript //nologo "%VbsFile%" "%~1"
Exit /B
REM -----------------------------------------------------------------------------
:RunAsAdmin
cls & color 9E & Mode 95,5
echo(
echo( ===========================================================
echo( Please wait a while ... Running as Admin ....
echo( ===========================================================
Powershell start -verb runas '%0' Admin & Exit
REM -----------------------------------------------------------------------------