各位先進大家好
問題源自於小弟自己寫了一支用來檢查個人電腦資安設定的執行檔(.exe),
目的在於檢查公司內部的個人電腦或伺服器GCB政策套用情況、防毒軟體是否安裝、更新等等,
並將結果回傳伺服器
由於該程式執行時需要用到管理者的權限
並且希望能在使用者不管用AD帳號或是本機帳號登入時都能在背景自動執行
所以導致許多AD中大量派送的方式都行不通
試過本機電腦原則-電腦設定-Windows設定-指令碼(啟動)或是-使用者設定-Windows設定-指令碼(登入)中新增自己寫的bat檔案,以自動連到遠端共享資料夾並執行程式
但是由於需要管理者權限,導致如果使用者用非管理者帳號登入就會跳出輸入帳號與密碼的視窗,如果說希望能在使用者不管用AD帳號或是本機帳號登入時都能在背景自動執行該程式
AD還有什麼方法能夠自動派送到大量電腦,並且不管使用者用哪個帳號都能在背景自動執行呢?
寫BAT,放在::START的後面
@echo off
CLS
ECHO.
ECHO =============================
ECHO Running Admin Shell
ECHO =============================
:init
setlocal DisableDelayedExpansion
set "batchPath=%~0"
for %%k in (%0) do set batchName=%%~nk
set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
setlocal EnableDelayedExpansion
:checkPrivileges
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )
:getPrivileges
if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
ECHO.
ECHO **************************************
ECHO Invoking UAC for Privilege Escalation
ECHO **************************************
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
ECHO args = "ELEV " >> "%vbsGetPrivileges%"
ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
ECHO args = args ^& strArg ^& " " >> "%vbsGetPrivileges%"
ECHO Next >> "%vbsGetPrivileges%"
ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
"%SystemRoot%\System32\WScript.exe" "%vbsGetPrivileges%" %*
exit /B
:gotPrivileges
setlocal & pushd .
cd /d %~dp0
if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul & shift /1)
::::::::::::::::::::::::::::
::START
::::::::::::::::::::::::::::
frankychen 大大您好
以下是我目前寫的批次檔
==============================================
@ECHO OFF
SET Download_ServerName=172.26.X.X
SET ShareFolderName=checktest
SET StartTime=%Date% %TIME%
SET ProgramPath=%USERPROFILE%\checkfolder
SET ExeFile=%ProgramPath%\DemoCheck1081019_V1.exe
SET LogFile="%USERPROFILE%\checkfolder\checkstatus.log"
IF NOT EXIST "%ProgramPath%" MD "%ProgramPath%"
REM 批次檔開始執行時間 : %StartTime% > %LogFile%
ECHO Batch file starts execution time : %StartTime% > %LogFile%
REM 測試連線_DownloadServer
REM 開始進行連線測試(檔案下載伺服器 %Download_ServerName% ) : %DATE% %TIME% >> %LogFile%
ECHO Start connection checkstatus.(File download Server %Download_ServerName% ): %DATE% %TIME% >> %LogFile%
ping /n 1 "%Download_ServerName%">nul||goto ErrPing
IF NOT EXIST "ExeFile" goto download ELSE goto check
:check
REM 開始進行檔案比對 : %DATE% %TIME% >> %LogFile%
ECHO Start comparing files : %DATE% %TIME% >> %LogFile%
FC "\%Download_ServerName%%ShareFolderName%\DemoCheck1081019_V1.exe" "%ExeFile%" >nul
if %errorlevel% equ 0 goto run
:download
REM 開始進行檔案下載 : %DATE% %TIME% >> %LogFile%
ECHO Start downloading files : %DATE% %TIME% >> %LogFile%
COPY "\%Download_ServerName%%ShareFolderName%\DemoCheck1081019_V1.exe" "%ExeFile%" /Y||goto ErrorCopy
:run
REM 執行
REM 開始執行檔案 : %DATE% %TIME% >> %LogFile%
ECHO Start executing files : %DATE% %TIME% >> %LogFile%
START %ProgramPath%\DemoCheck1081019_V1.exe
ECHO Execution is complete : %DATE% %TIME% >> %LogFile%
:end
REM 批次檔完成時間 : %DATE% %TIME% >> %LogFile%
ECHO Batch file completion time : %DATE% %TIME% >> %LogFile%
ECHO. >> %LogFile%
Exit
REM 以下為錯誤訊息
:ErrPing
REM 連線失敗,批次檔結束時間 : %DATE% %TIME% >> %LogFile%
ECHO Connection failed, batch file terminated time : %DATE% %TIME% >> %LogFile%
ECHO. >> %LogFile%
Exit
:ErrCopy
REM 下載失敗,批次檔結束時間 : %DATE% %TIME% >> %LogFile%
ECHO Download failed, batch file terminated time : %DATE% %TIME% >> %LogFile%
ECHO. >> %LogFile%
Exit
====================================
其實目前主要功能就是到AD Server 上的 ShareFolder內
把我自己用ASP.NET C# 寫的檢查程式DemoCheck1081019_V1.exe這個
檔案,抓到使用者電腦的特定資料夾內,然後執行
請問一下你這段批次檔的功能是程式執行時的提權動作嗎
因我沒看到哪邊有使用管理者帳號密碼的code(抱歉我對批次檔也是很粗淺的了解而已)
應用的話 我要怎麼在你的批次檔中加入我的code 呢?
謝謝您的回答
@echo off
CLS
ECHO.
ECHO =============================
ECHO Running Admin Shell
ECHO =============================
:init
setlocal DisableDelayedExpansion
set "batchPath=%~0"
for %%k in (%0) do set batchName=%%~nk
set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
setlocal EnableDelayedExpansion
:checkPrivileges
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )
:getPrivileges
if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
ECHO.
ECHO **************************************
ECHO Invoking UAC for Privilege Escalation
ECHO **************************************
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
ECHO args = "ELEV " >> "%vbsGetPrivileges%"
ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
ECHO args = args ^& strArg ^& " " >> "%vbsGetPrivileges%"
ECHO Next >> "%vbsGetPrivileges%"
ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
"%SystemRoot%\System32\WScript.exe" "%vbsGetPrivileges%" %*
exit /B
:gotPrivileges
setlocal & pushd .
cd /d %~dp0
if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul & shift /1)
::::::::::::::::::::::::::::
::START
SET Download_ServerName=172.26.X.X
SET ShareFolderName=checktest
SET StartTime=%Date% %TIME%
SET ProgramPath=%USERPROFILE%\checkfolder
SET ExeFile=%ProgramPath%\DemoCheck1081019_V1.exe
SET LogFile="%USERPROFILE%\checkfolder\checkstatus.log"
IF NOT EXIST "%ProgramPath%" MD "%ProgramPath%"
REM 批次檔開始執行時間 : %StartTime% > %LogFile%
ECHO Batch file starts execution time : %StartTime% > %LogFile%
REM 測試連線_DownloadServer
REM 開始進行連線測試(檔案下載伺服器 %Download_ServerName% ) : %DATE% %TIME% >> %LogFile%
ECHO Start connection checkstatus.(File download Server %Download_ServerName% ): %DATE% %TIME% >> %LogFile%
ping /n 1 "%Download_ServerName%">nul||goto ErrPing
IF NOT EXIST "ExeFile" goto download ELSE goto check
:check
REM 開始進行檔案比對 : %DATE% %TIME% >> %LogFile%
ECHO Start comparing files : %DATE% %TIME% >> %LogFile%
FC "\%Download_ServerName%%ShareFolderName%\DemoCheck1081019_V1.exe" "%ExeFile%" >nul
if %errorlevel% equ 0 goto run
:download
REM 開始進行檔案下載 : %DATE% %TIME% >> %LogFile%
ECHO Start downloading files : %DATE% %TIME% >> %LogFile%
COPY "\%Download_ServerName%%ShareFolderName%\DemoCheck1081019_V1.exe" "%ExeFile%" /Y||goto ErrorCopy
:run
REM 執行
REM 開始執行檔案 : %DATE% %TIME% >> %LogFile%
ECHO Start executing files : %DATE% %TIME% >> %LogFile%
START %ProgramPath%\DemoCheck1081019_V1.exe
ECHO Execution is complete : %DATE% %TIME% >> %LogFile%
:end
REM 批次檔完成時間 : %DATE% %TIME% >> %LogFile%
ECHO Batch file completion time : %DATE% %TIME% >> %LogFile%
ECHO. >> %LogFile%
Exit
REM 以下為錯誤訊息
:ErrPing
REM 連線失敗,批次檔結束時間 : %DATE% %TIME% >> %LogFile%
ECHO Connection failed, batch file terminated time : %DATE% %TIME% >> %LogFile%
ECHO. >> %LogFile%
Exit
:ErrCopy
REM 下載失敗,批次檔結束時間 : %DATE% %TIME% >> %LogFile%
ECHO Download failed, batch file terminated time : %DATE% %TIME% >> %LogFile%
ECHO. >> %LogFile%
Exit
::::::::::::::::::::::::::::
用Autoit打包,Autoit可以將帳密包在裡面。
就會以管理者權限執行EXE檔了
https://ithelp.ithome.com.tw/questions/10195760
Windows工作排程器 (Windows Task Scheduler)
1.名稱:自訂,執行帳戶:SYSTEM
2.觸發程序:系統啟動
3.動作:你自己寫的EXE
差點忘了,你會寫Code嘛,自己弄成Windows服務吧。
powershell winlogbeat Demo
if (Get-Service winlogbeat -ErrorAction SilentlyContinue){Write-Output "Winlogbeat Service OK"}
else
{
$workdir = "C:\DemoIT\Winlogbeat"
# Create the new service.
New-Service -name winlogbeat `
-displayName Winlogbeat `
-binaryPathName "`"$workdir\winlogbeat.exe`" -c `"$workdir\winlogbeat.yml`" -path.home `"$workdir`" -path.data `"C:\ProgramData\winlogbeat`" -path.logs `"C:\ProgramData\winlogbeat\logs`""`
-Description "This is a Winlogbeat service,Collect hard drive SMART information"
# Attempt to set the service to delayed start using sc config.
Try {
Start-Process -FilePath sc.exe -ArgumentList 'config winlogbeat start=delayed-auto'
}
Catch { Write-Host "An error occured setting the service to delayed start." -ForegroundColor Red }
}
tyudfg1682 感謝您的回答
我有兩個小問題
1.關於Windows工作排程器 (Windows Task Scheduler)的部分
確認一下我所理解的作法:
(1).在AD Server上面的ShareFoler 中放入我的檢查程式
(2).在AD的群組原則管理-電腦設定-排定的工作內設定工作排程
(3).設定執行檔的路徑為AD Sharefolder的檢查程式、指定執行帳號為AD管理者帳號、設定執行條件(登出或啟動)....等
(4).派送該政策到使用者電腦
(5).使用者登入/啟動時,就會主動以網域管理者帳號以背景服務模式執行AD Server上Sharefolder內的檢查程式了,對吧?
2.關於寫成Windows服務的部分
抱歉其實我也是程式初學者而已!!
老實說這一段完全看不懂
譬如說 我今天的檢查程式檔案名稱叫check.exe
我是怎麼用您上述的powershellcode將它變成服務呢?
再者,轉換成服務後,我要如何達到我的目的:大量派送到網域電腦?
謝謝您的解答
透過工作排程的部份,如果你要把你的check.exe程式,
放ShareFoler讓每台電腦跑的話,啟動工作排程的帳戶會有影響到
透過登入才啟動的,一定是登入的帳戶去做SMB認證,
如果是不登入啟動的,你帳戶只能掛local System,
會是電腦帳戶去做SMB驗證
寫成服務如果不會寫Code就不用太免強了,寫了之後如果不要用了
你還要會卸載才行,
上面的Code只是一個if判斷是否已經產生過winlogbeat這個服務
如果沒有就新增,裡面的參數就是一般的
程式名稱,完整服務名稱,程式路徑,啟動參數這類的
然後我先說一件事情,利用GPO放在啟動時執行bat或者Script
還有登入的時候執行Bat或者Script,這兩個沒把握就別動它
因為微軟不保證一定會執行,並且還有一定的風險
所以最佳解答那個我只能說有遇到就是倒楣,沒遇到就繼續用
原因在於部屬錯誤的bat或者是Script檔案都會造成登入卡死
如果網路與網域控制站DC連線不穩,導致啟動或者登入的當下沒有
辦法第一時間連線到GPO去執行bat或者Script的話,就會失敗
所以不一定會被執行,如果執行的bat檔案或者Script裡面
出現什麼錯誤造成該bat或者Script無法結束的話
那USER端的桌面將會卡死在Windows登入中的畫面
至於卡多久才會進去桌面,我沒有興趣測試,我雖然也有用
但是我很小心的,只用來做很簡單程式,有跑沒跑都不影響
反正我工作排程會補跑,並不會有什麼漏跑的問題
tyudfg1682 謝謝你的回覆
其實最佳解答那邊我是IT幫新手,因為解任務就先點了,不然沒辦法留言討論,其實你這篇比較符合我需求
因為我就是想跳過UAC機制,讓使用者不知不覺中執行此程式,好像就只能透過工作排程的方式派送
但是我實作中遇到一些小問題
我實驗電腦明明就已經套用該GPO,但是一直沒有在工作排程中出現GPO中設定的(在其他測試環境有成功,且在工作管理員中有看到我的執行檔)
以下是我個人電腦的測試環境設定
下圖是我新建的GPO名稱(chechdemogpo)
以及相關設定
請問是否有哪邊設定錯誤
PS.測試ADserver(Windows server2012)
測試電腦(Windows 10 64bit)
沒有在工作排程中出現GPO中設定
你的電腦物件放在哪個 組織單位OU?
那個OU有沒有連結你現在設定的GPO?
第2張圖設定錯誤
執行任務時使用下列使用者帳戶:
GPO這個地方的設定並不支援儲存密碼,
所以無法使用一般登入用的使用者帳戶
你只能設定群組,或者是服務專用帳戶
群組:users、administrators、everyone這類的群組包含網域群組
服務帳戶:system、network service 無須密碼的系統帳戶
更安全設定的服務帳戶: GMSA帳戶(需要對Windows Server有一定了解)
我的電腦物件放在demo的組織單位無誤
第2張圖設定錯誤
執行任務時使用下列使用者帳戶:
GPO這個地方的設定並不支援儲存密碼,
有點不瞭解,所以說安全選項的-執行任務時,請用下列用戶帳戶
之中的設定只能是群組或服務專用帳戶嗎?
譬如Aministrator群組之類的
服務帳號的部分要怎麼新增呢?
就是這個意思,所以我一開始的文章不是就有寫了,
帳戶那邊是用: SYSTEM(這是本機專用服務帳戶,比administrator還大)
你要不要去買本書來看,基本功不熟,正式操作會很慘喔
tyudfg1682大哥
你上面列的這些設定
所有的設定組合我都試過(包括用哪種帳號、啟動觸發程序及相關設定等),但是一直跑不起來
有時候會成功在實驗主機看到生成工作排程,但是工作排程啟動失敗(原因是system帳戶無法啟動該行程)
所以不知道到底哪邊有錯誤
所有測試都要用乾淨的環境,還有本地端先做測試,一步一步確認功能與設定沒有問題之後,再往大環境部屬,你先弄一台乾淨,只有安裝作業系統,什麼都沒動過的Windows 10自己用GPO對自己單機做單機部屬,確認沒問題再去AD那邊做測試機部屬,基本上你沒有用VM來做測試環境的話是沒有效率的,測試環境是需要隨時可以打掉重來的。
你最好先測試,
1.是我的程式造成問題,導致工作排程沒有跑起來
2.是設定有問題哪裡有錯,導致工作排程沒有跑起來
3.是不是有網域環境的影響,導致工作排程跑不起來
我目前確實是使用自己建的VM當測試環境,我再試試看
我有自己建立AD Server 跟 PC 的虛擬機
目前看環境上都沒什麼問題