To perform certain customized functions, scripts can be run when Windows Operating System starts or shuts down. The method to execute a script at startup or shutdown varies with different versions. Here’s how to execute scripts at shutdown and startup.
Note: This trick works in Windows XP, Vista and Windows 7 and recent versions, but the method varies depending on your edition.
How to execute a script for professional or full editions of Windows?
Start the policy editor of the local group: Start Menu > Run > Type gpedit.msc
- Under Vista or Windows 10 you can type the command in the search bar of the start menu or press Windows key + R
- Go to Computer Configuration > Windows Settings > Scripts (Startup/Shutdown)
- Depending on what you want, double click on Start or Stop system
- Click Add > Browse and select the script you want to add.
How to execute a script for all editions?
These steps involve modifying the registry. It is therefore recommended to make a backup before proceeding.
- Open notepad and copy the code below:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts] [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Shutdown] [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Startup] [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Startup\0] "GPO-ID"="LocalGPO" "SOM-ID"="Local" "FileSysPath"="C:\\Windows\\System32\\GroupPolicy\\Machine" "DisplayName"="Stratégie de groupe locale" "GPOName"="Stratégie de groupe locale" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Shutdown\0] "GPO-ID"="LocalGPO" "SOM-ID"="Local" "FileSysPath"="C:\\Windows\\System32\\GroupPolicy\\Machine" "DisplayName"="Stratégie de groupe locale" "GPOName"="Stratégie de groupe locale" [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Startup\0\0] "Script"="C:\\script1.bat" "Parameters"="" "ExecTime"=hex(b):00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
Once you understand the code, you can adapt it to suit your needs by changing some of the variables.
- C:\\script.bat represents the path to your script on the hard disk.
- 0 represents the number of the script in case you have several scripts to run.
- Startup is the time of execution of the script.
It is possible to add multiple scripts:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State\Machine\Scripts\Startup\0\0] "Script"="C:\\script1.bat" "Parameters"="" "ExecTime"=hex(b):00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
It is also possible to specify parameters for the execution of this script by changing the Parameters field.
Finally, save this text file:
- Go to File > Save.
- Give it a name ending with .reg.
- Select All files in the list box File Type.
- Save the file to the desired location and double click on this file.
Do you need more help with Windows? Check out our forum!
Выполнение сценариев при выходе из системы
Время на прочтение1 мин
Количество просмотров3.8K
Применительно к Windows XP.
Можно, конечно, как и советуют на разных форумах, создать файл quit.cmd, в котором написать все необходимые сценарии, поставить в конце выполнение shutdown
и запускать его каждый раз чтобы выключить ПК. Можно и так, но мне более элегантным видится вариант с групповыми политиками:
Пуск \
Выполнить \
gpedit.msc
Запустилась консоль управления групповой политикой. В ней нужен пункт:
Конфигурация пользователя \
Конфигурация Windows \
Сценарии (вход/выход из системы)
И здесь, в пункте «Выход из системы» добавлять желаемые сценарии.
За
Не нужно запоминать, что для выхода необходимо запускать файл, он запускается самостоятельно при выходе. Элегантно, красиво, ненавязчиво.
Против
Метод с ручным запуском скрипта позволяет непривилегированным пользователям повесить предварительную отработку действий хотя бы при простом логоффе. Групповые политики же для непривилегированных недоступны полностью.
Допольнительно
- Выполнение командного файла перед входом в систему
If you want to run Windows PowerShell scripts first at user logon, logoff, startup, and shutdown, follow these steps. Using the Local Group Policy Editor and Registry Editor, you can prioritize Windows PowerShell scripts before non-PowerShell scripts.
All the scripts run simultaneously when a user logs on or starts up the computer. It may cause some delay in the startup or running a specific program. Running all the Windows PowerShell scripts and Group Policy Object is often required before non-PowerShell scripts.
To run Windows PowerShell scripts first at user logon, logoff, startup, and shutdown, on your Windows computer follow these steps-
- Press Win+R.
- Type gpedit.msc and hit the Enter button.
- Go to Scripts in Computer Configuration.
- Double-click on Run Windows PowerShell scripts first at user logon, logoff.
- Select the Enabled option.
- Click Apply and OK.
- Double-click on Run Windows PowerShell scripts first at computer startup, shutdown.
- Select the Enabled option.
- Click Apply and OK.
Let’s check out these steps in detail.
At first, you will have to open the Local Group Policy Editor. For that, press Win+R, type gpedit.msc
, and hit the Enter button. After opening it, navigate to the following path-
Computer Configuration > Administrative Templates > System > Scripts
You will see two settings called:
- Run Windows PowerShell scripts first at user logon, logoff,
- Run Windows PowerShell scripts first at computer startup, shutdown.
Double-click on each of them and select the Enabled option.
Click the Apply and OK to save the change.
Read: How to add PowerShell to Context Menu in Windows
Run Windows PowerShell scripts first at user logon, logoff, startup, and shutdown using Registry Editor
To run Windows PowerShell scripts first at user logon, logoff, startup, and shutdown using Registry Editor, follow these steps-
- Press Win+R.
- Type regedit and hit the Enter button.
- Click the Yes button.
- Go to System in HKLM.
- Right-click on System > New > DWORD (32-bit) Value.
- Name it as RunUserPSScriptsFirst.
- Double-click on it and set the Value data as 1.
- Click the OK button.
- Right-click on System > New > DWORD (32-bit) Value.
- Name it as RunComputerPSScriptsFirst.
- Double-click on it to set the Value data as 1.
- Click OK to save the change.
To know more, keep reading.
Before getting started, it is recommended to backup all Registry files and create a System Restore point.
Press Win+R to open the Run prompt, type regedit
, and hit the Enter button. If the UAC prompt appears, click the Yes button. After that, navigate to this path-
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
Here, you will have to create two REG_DWORD values. To do that, right-click on System > New > DWORD (32-bit) Value and name it RunUserPSScriptsFirst.
Double-click on it and set the Value data as 1.
Follow the same steps to create another DWORD (32-bit) Value and name it as RunComputerPSScriptsFirst. Then, set the Value data as 1.
RunUserPSScriptsFirst represents the Run Windows PowerShell scripts first at user logon, logoff setting, whereas RunComputerPSScriptsFirst defines the Run Windows PowerShell scripts first at computer startup, shutdown setting.
If you want to revert these changes, you can follow these steps.
If you have done it using the Local Group Policy Editor, open the same path and select the Not Configured option. If you have done it using the Registry Editor, open the same System key and delete those two REG_DWORD values. To remove them, right-click on each, select the Delete option, and confirm it by clicking the OK button.
Read: How to add PowerShell to Context Menu in Windows.
I hope it helps.
Which is the easiest way to run a PowerShell script at startup?
You can use the Task Manager to execute anything, including a PowerShell script that runs as soon as you log in to your PC. Since many programs are executed then, it is best to add delays or run it after a few minutes.
What is PowerShell used for?
PowerShell, a command-line shell and scripting language, is widely employed for automating system management tasks on Windows and other platforms. It is also utilized for creating, testing, and deploying software solutions, which play a crucial role in streamlining the software development and delivery process.
Выполнить PowerShell скрипт на компьютере с помощью GPO
Вы можете использовать групповые политики Windows для выполнения файлов различных скриптов при загрузке/выключении компьютера или входе/выходе пользователя. С помощью GPO вы можете исполнять на компьютерах домена не только классические файлы скриптов (.bat, .cmd, ,vbs), но и Startup/Shutdown/Logon/Logoff скрипты PowerShell (.ps1)
В современных версиях Windows вы можете настроить запуск логон/логоф скриптов PowerShell напрямую из редактора групповых политик (ранее приходилось вызывать ps1 скрипты из bat файлов через параметр исполняемого файла powershell.exe).
Запустите консоль управления доменными политиками GPMC.msc (Group Policy Management сonsole). Создайте новую политику (GPO) и назначьте ее на нужный контейнер с пользователями или компьютерами (можно использовать WMI фильтры GPO для более тонкого нацеливания политики). Перейдите в режим редактирования политики.
Вы должны выбрать раздел GPO для запуска PowerShell скрипта в зависимости от того, когда вы хотите выполнить ваш скрипт.
- Если PS скрипт должен быть запущен при входе пользователя на компьютер (настройка параметров окружения пользователя, программ, например: вы хотите при входе пользователя автоматическое создавать подпись в Outlook на основе данных из пользователя AD, настроить параметры экранной заставки или стартового экрана) или при выходе пользователя, вам нужно перейти в раздел GPO: User Configuration -> Policies -> Windows Settings -> Scripts (Logon / Logoff);
- Если вы хотите запускать скрипт PowerShell при загрузке компьютера (отключение устаревших протоколов: NetBIOS, SMBv1, настройка параметров безопасности компьютера и т.д.) или перед корректным выключением компьютера, вам нужно перейти в секцию GPO с настройками компьютера: Computer Configuration -> Policies -> Windows Settings -> Scripts (Startup / Shutdown).
Запуск PowerShell скрипта при загрузке компьютера с помощью групповой политики
Допустим, нам нужно запускать PowerShell скрипт при загрузке Windows. Для этого нужно выбрать Startup и в открывшемся окне перейди на вкладку PowerShell Scripts.
Теперь нужно скопировать файл с вашим PowerShell скриптом на контроллер домена. Скопируйте ваш файл ps1 в каталог Netlogon на контроллере домена (например, \\itoservice.ru\netlogon ).
Т.к. мы настраиваем запуск Startup скрипта PowerShell, нужно в разрешениях ps1 файла (или всего каталога Machine\Scripts\Startup) проверить NTFS права доступа на чтение и выполнение (Read & Execute) для группы Domain Computers и/или Authenticated Users.
Теперь нужно нажать кнопку Add и укажите UNC путь к вашему файлу скрипта ps1 в Netlogon.
Если вы запускаете несколько PowerShell скриптов через GPO, вы можете управлять порядком из запуска с помощью кнопок Up/Down.
Для корректного выполнения скриптов PowerShell при загрузке компьютера нужно настроить время задержки перед запуском с помощью политики в разделе Computer Configuration -> Administrative Templates -> System -> Group Policy. Включите политику Configure Logon Script Delay (Настроить задержку сценария входа в систему) и укажите задержку в минутах перед запуском логон-скриптов (достаточное для окончания инициализации и загрузки всех необходимых служб). Обычно достаточно поставить здесь 1-2 минуты.
Если в вашем PowerShell скрипте используются сетевые инструменты Windows, для некоторых GPO нужно включить политику “Specify startup policy processing wait time” в разделе Computer Configuration -> Policies -> Administrative Templates -> System -> Group Policy. Попробуйте начать со значения 60 сек. После включения этой политики компьютер будет ждать 60 секунд прежде, чем начать применять стартап скрипты. Обычно этого достаточно для инициализации сетевой подсистемы Windows.
В Windows Server 2012R2 и Windows 8.1 и выше PowerShell скрипты в GPO запускаются из каталога NetLogon в режиме Bypass. Это означает, что настройки политики запуска сценариев PowerShell игнорируются. Если вы хотите запустить скрипт из другого каталога, или в вашей сети остались клиенты с Windows 7 или Windows Server 2008R2, вам нужно настроить политику выполнения PowerShell скриптов.
По умолчанию в настройках безопасности Windows запрещен запуск PowerShell скриптов. Значение текущей настройки политики запуска сценариев PowerShell можно получить командой Get-ExecutionPolicy. Если политика не настроена, команда вернет Restricted (блокируются любые скрипты). Параметры безопасности запуска PowerShell скриптов можно настроить через политику “Включить выполнение сценариев” / “Turn On Script Execution” (в разделе GPO Computer Configuration -> Administrative Templates -> Windows Components -> Windows PowerShell). Возможные значения политики:
- Allow only signed scripts (AllSigned)– можно запускать только подписанные скрипты PowerShell – самый лучший сценарий с точки зрения безопасности;
- Allow local scripts and remote signed scripts (RemoteSigned)– можно запускать любые локальные и подписанные удаленные скрипты;
- Allow all scripts (unrestricted) – самый небезопасный вариант, т.к. разрешает запуск любых PowerShell скриптов.
Если вам не подходит не один из предложенных сценариев настройки политики запуска PowerShell скриптов, вы можете запускать PowerShell скрипты в режиме Bypass (скрипты не блокируются, предупреждения не появляются).
Для этого PowerShell скрипт нужно запускать из секции Startup -> Scripts. В этой секции вы можете настроить запуск ps1 сценария с помощью создания обычного Startup скрипта, запускающего исполняемый файл powershell.exe. Укажите:
- Script name: %windir%\System32\WindowsPowerShell\v1.0\powershell.exe
- Script Parameters: -Noninteractive -ExecutionPolicy Bypass –Noprofile -file %~dp0MyPSScript.ps1
Символы %~dp0 при запуске на клиенте автоматически преобразуются в UNC путь до каталога со скриптом на SYSVOL.
В данном случае вы принудительно разрешили запуск любого (даже ненадежного) скрипта PowerShell с помощью параметра Bypass.
Перезагрузите компьютер, чтобы обновить настройки GPO и проверьте, что ваш PowerShell скрипт запустился после загрузки.
Выполнить PowerShell скрипт при входе пользователя в Windows
Рассмотрим сценарий автоматического запуска PowerShell скрипта при входе пользователя в Windows (или при выходе).
Если вам нужно запустить скрипт не при загрузке компьютера, а после входа пользователя в Windows (для каждого пользователя компьютера), вам нужно привязать GPO к OU Active Directory с пользователями. В этом случае PowerShell нужно настроить в следующем разделе User Configuration вашей GPO
Если вы хотите, чтобы политика выполнялась для всех пользователей определенного компьютера, нужно привязать политику к OU с компьютерами и включить режим замыкания групповой политики (параметр Configure User Group Policy Loopback Processing mode в разделе Computer Configuration -> Administrative Templates -> System -> Group Policy). Если не включать режим замыкания, то параметры из раздела User Configuration не будут применены к пользователю.
В этом примере для теста будет использоваться простой PowerShell скрипт, который пишет в текстовый лог файл время входа пользователя.
- Скопируйте файл скрипта PowerShell в каталог \\itoservice.ru\NETLOGON\ на контроллере домена AD
- Перейдите в раздел User Configuration -> Policies -> Windows Settings -> Scripts -> Logon;
- Перейдите на вкладку PowerShell Scripts и добавьте ваш PS1 файл скрипта (используйте UNC путь, например \\itoservice.ru\NETLOGON\UserLog.ps1 );
- Выполните логофф пользователя на целевом компьютере и выполните вход;
- Ваш PowerShell скрипт будет запущен автоматически через GPO при входе пользователя;
- Вы можете убедится, что логон скрипт выполнен успешно под пользователем по событию с Event ID 5018 в журнале Microsoft-Windows-GroupPolicy/Operational Event Viewer:
Completed Logon script for winitpro\kbuldogov in 11 seconds.
Если вы хотите, чтобы пользователь не мог получить доступ к своему рабочему столу до окончания работы скрипта, нужно включить параметр Run logon scripts synchronously = Enable (Computer Configuration\Administrative Templates\System\Logon). В этом случае explorer не закончится, пока не отработают все политики и логон скрипты (это увеличивает время входа!).
Обратите внимание, что скрипт выполняется с правами текущего пользователя. Если у пользователя есть права администратора на компьютере и на него действуют политики User Account Control (UAC), PowerShell скрипт не сможет внести изменения, требующие повышенных привилегий.
Для запуска PowerShell скриптов с привилегированными правами при входе простых пользователей, можно использовать назначенные задания планировщика. Для этого нужно:
- Создать задание Task Scheduler в разделе User Configuration -> Preferences -> Control Panel Settings -> Scheduled Task;
- На вкладке General указать что задание запускается от имени пользователя %LogonDomain%\%LogonUser и включите опцию Run with highest privileges ;
- На вкладке Trigger укажите, что задание должно запускаться At log on;
- И на вкладке Actions укажите путь к вашему PowerShell скрипту:
Action: Start a program
Program/Script: C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe
Add Arguments (optional): -ExecutionPolicy Bypass -command «& \\itoservice.ru\Netlogon\yourscript.ps1»
Такой PowerShell скрипт будет запускаться с правами администратора (если пользователь добавлен в группу локальных администраторов Windows).
Некоторые скрипты нужно запускать для каждого пользователя только один раз при первом входе на компьютер (инициализация рабочего окружения, копирование папок или конфигурационных файлов, создание ярлыков и т.д.).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
//////////////////////////////////////////////////////////////////////////////// // Remendir.cpp // // Made by osnu #define WIN32_LEAN_AND_MEAN #include <windows.h> TCHAR GWndname[]=TEXT("WndRem"); TCHAR GAppname[]=TEXT("Remendir"); TCHAR GFilename[32]; /* Текстовой файл, должен быть в каталоге программы * При запуске не будет "Напоминание будет осуществленно..." * если имя "zRemendir.txt", если "wRemendir.txt" будет: * "Напоминание будет осуществленно..." */ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LRESULT retval=0; static UINT_PTR nTimer; switch(uMsg) { case WM_TIMER: { KillTimer(hWnd, nTimer); HANDLE hFile=CreateFile(GFilename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(INVALID_HANDLE_VALUE!=hFile) { DWORD dwFileSize=GetFileSize(hFile, NULL); if( (0!=dwFileSize) && (2048>=dwFileSize) ) { char* InACh=(char*)GlobalAlloc(GMEM_FIXED,dwFileSize+1); if(InACh) { DWORD dwBytesRead; ReadFile(hFile,(LPVOID)InACh,dwFileSize,&dwBytesRead,NULL); if(dwBytesRead) { TCHAR* UCh = new TCHAR[dwFileSize+1]; MultiByteToWideChar(CP_ACP,0,InACh,-1,UCh,dwFileSize); UCh[dwFileSize]=0; MessageBox(hWnd,UCh,GAppname,MB_OK|MB_ICONINFORMATION|MB_SETFOREGROUND|MB_SYSTEMMODAL); delete [] UCh; GlobalFree(InACh); CloseHandle(hFile); SendMessage(hWnd,WM_DESTROY,0,0); break; } GlobalFree(InACh); } } CloseHandle(hFile); } } break; case WM_QUERYENDSESSION: ShowWindow(hWnd,SW_SHOW); nTimer=SetTimer(hWnd,1,50,NULL); if(!nTimer) return 1; else return 0; case WM_DESTROY: PostQuitMessage(0); break; default: retval=DefWindowProc(hWnd,uMsg,wParam,lParam); } return retval; } BOOL CheckFileExists(const TCHAR* Filename) { WIN32_FIND_DATA FindFile; HANDLE handle=FindFirstFile(Filename, &FindFile); if(INVALID_HANDLE_VALUE==handle) return FALSE; FindClose(handle); return TRUE; } // // Entry point // int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { HWND hWnd=FindWindow(GWndname,NULL); if(hWnd) { if(IDYES==MessageBox(hWnd,TEXT("Программа уже работает...\nЗавершить программу?"),GAppname,MB_YESNO|MB_ICONQUESTION|MB_SETFOREGROUND|MB_SYSTEMMODAL)) SendMessage(hWnd,WM_CLOSE,0,0); return 0; } lstrcpy(GFilename,TEXT("zRemendir.txt")); if(!CheckFileExists(GFilename)) { lstrcpy(GFilename,TEXT("wRemendir.txt")); if(!CheckFileExists(GFilename)) { MessageBox(hWnd,TEXT("Нет файла напоминаний"),GAppname,MB_OK|MB_ICONWARNING|MB_SETFOREGROUND|MB_SYSTEMMODAL); return 0; } } if( 'w'==GFilename[0] ) MessageBox(hWnd,TEXT("Напоминание будет осуществленно..."),GAppname,MB_OK|MB_ICONINFORMATION|MB_SETFOREGROUND|MB_SYSTEMMODAL); WNDCLASSEX wcex={sizeof(WNDCLASSEX),CS_VREDRAW|CS_HREDRAW,WndProc,0,0,hInstance, LoadIcon(NULL,IDI_APPLICATION),LoadCursor(NULL,IDC_ARROW),0,NULL,GWndname,NULL,}; ATOM Atom=RegisterClassEx(&wcex); if(Atom) { hWnd=CreateWindowEx(0,MAKEINTATOM(Atom),GAppname, 0,0,0,0,0,HWND_DESKTOP,NULL,hInstance,NULL); if(hWnd) { MSG msg; while(GetMessage(&msg,NULL,0,0)>0) { TranslateMessage(&msg); DispatchMessage(&msg); } } } return 0; } //////////////////////////////////////////////////////////////////////////////// // <<eof>> Remendir.cpp //////////////////////////////////////////////////////////////////////////////// |