Jak mogę przekazać argument do zaplanowanego zadania?

2

W Harmonogramie zadań mam zadanie korzystające z konta SYSTEM, które uruchamia plik wsadowy. Użytkownik (inny niż administrator) ma inny plik wsadowy, który uruchamia zadanie. W jaki sposób partia użytkownika może ustawić zmienną, której może używać partia zadań?

Jason
źródło

Odpowiedzi:

2

Dynamicznie ustaw wartość zmiennej w skrypcie wsadowym, który będzie wykonywany przez Harmonogram zadań

Ponieważ wyjaśniłeś i potwierdziłeś, co następuje:

  1. Potrzebujesz wartości zmiennej w skrypcie wsadowym wykonywanym przez Harmonogram zadań,SYSTEM aby ustawić ją jako wartość zgodną z SID użytkownika uruchamiającego skrypt logowania
  2. Możesz użyć lokalnej ścieżki pliku na maszynę do lokalizacji skryptu , którą wykona Harmonogram zadań
  3. Nigdy nie będziesz mieć więcej niż jednego użytkownika, który zaloguje się do tego samego systemu operacyjnego, który wykona ten skrypt

Zapisałem to rozwiązanie jako osobną odpowiedź z bardziej szczegółowymi sugerowanymi podejściami.

Będziesz chciał upewnić się, że:

  • Upewnij się, że na każdym komputerze, który wykona skrypt wsadowy, zostanie skonfigurowana skorelowana nazwa zaplanowanego zadania
  • Potwierdź, że każde skorelowane zaplanowane zadanie na każdym komputerze, które jest wykonywane, schtaskswszystkie wskazują tę samą jedną standardową ścieżkę skryptu wsadowego i nazwę pliku.

Batch [Login] Przykład skryptu

Ponownie wykorzystałem logikę, którą już skonfigurowałeś, ale dodałem kilka dodatkowych zmiennych i warunkową logikę JEŻELI, która utworzy folder lokalny na komputerze lokalnym, skrypt skryptowy będzie rezydował, jeśli jeszcze nie istnieje, i usuń plik wsadowy z tego folder, jeśli już istnieje, ponieważ jest tworzony dla każdego uruchomienia.

Zasadniczo spowoduje to utworzenie dynamicznego skryptu wsadowego za każdym razem, gdy zostanie wykonany (przy logowaniu). Skrypt wsadowy, który tworzy, będzie zawierał Reg Addlogikę i polecenia z wartościami SID części użytkownika, dla którego skrypt logowania uruchomił się przy logowaniu. Kiedy więc Harmonogram zadań uruchomi skrypt, zapewni to, że skrypt zawsze będzie miał wymaganą wartość dodaną przy każdym logowaniu / wykonywaniu skryptu.

@ECHO ON

SET LocalDir=C:\localfolder
SET TaskScript=TaskScript.cmd

IF NOT EXIST "%LocalDir%" MD "%LocalDir%"
IF EXIST "%LocalDir%\%TaskScript%" DEL /Q /F "%LocalDir%\%TaskScript%"

for /f "tokens=2" %%i in ('whoami /user /fo table /nh') do set usersid=%%i

ECHO reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\%usersid%" /v "State" /t REG_DWORD /d 128 /f>>"%LocalDir%\%TaskScript%"

schtasks /run /tn "My Profile Changer"

Zaplanowane zadanie

Musisz tylko upewnić się, że zadanie, które każesz schtaskswykonać (tj. "My Profile Changer"), Wskaże tę samą pełną ścieżkę, którą podałeś w skrypcie wsadowym logowania dla wartości zmiennych SET LocalDir=i SET TaskScript=.

Jeśli więc zmienne skryptu logowania są równe, C:\localfolder\TaskScript.cmdjest to ta sama wartość, na którą ma Program/Scriptwskazywać pole. Sugerowałbym również umieszczenie SET LocalDir=wartości zmiennej w Start in (optional):polu, ale NIE będziesz musiał dodawać żadnych argumentów, więc zostaw Add Arguments (optional):pole puste lub puste, bez żadnych elementów ( poniżej zrzutu ekranu ).

wprowadź opis zdjęcia tutaj


Dalsze zasoby

Pimp Juice IT
źródło
Podoba mi się ten pomysł. Zamiast ustawiać wartość na zmienną, zapisujesz wartość do pliku. Moim jedynym problemem jest to, że wprowadza to lukę w zabezpieczeniach: TaskScript.cmd jest modyfikowalny przez użytkownika i może spowodować, że zadanie się podniesie. Zamierzam to zmienić, aby tylko zapisać wartość, i niech inny skrypt odczyta tę wartość.
Jason
@Jason Przypuszczam, że pisanie tylko wartości, a nie cały skrypt, też by działało. Ze względów bezpieczeństwa będą potrzebować takiego samego dostępu do folderu, w którym znajduje się plik z wartością. Jestem zaznajomiony z polecaniem wsadowi czytania zawartości pliku z listy lub czegokolwiek, a następnie ustawiania go jako zmiennej w pozostałej części przetwarzania wsadowego. Może przynajmniej pomogłem ci wymyślić inną strategię, która wystarczy. Pamiętaj tylko, że kontrolujesz logikę skryptu logowania i ma ona logikę, aby najpierw usunąć partię zadań, która zostanie wykonana, jeśli istnieje, a następnie napisz ją tylko przy użyciu dozwolonej logiki.
Pimp Juice IT
@Jason Chciałem tylko, abyś zauważył, że nawet jeśli użytkownik utworzy skrypt, nie będzie on wykonywany przy użyciu tej logiki, chyba że uruchomi się schtasksz wiersza poleceń lub z harmonogramu zadań GUI. Możesz również utworzyć logikę po schtaskszakończeniu, aby usunąć skrypt wsadowy i folder, aby nie istniał, a użytkownik końcowy musiałby utworzyć oba, a następnie mieć dostęp do wiersza poleceń lub dostęp do GUI Harmonogramu zadań i wiedzieć, co wykonać.
Pimp Juice IT