Automate WSUS Cleanup - Bagaimana Untuk

Automate WSUS Cleanup

Saya akhirnya bosan membersihkan pelayan WSUS kami supaya saya mengautomasikan tugas ini. Saya berlari setiap malam. Berikut adalah tiga fail yang diperlukan untuk defrag pangkalan data WSUS dan mengeluarkan komputer usang dan kemas kini.

========= Skrip cmd Pembersihan WSUS utama =========
:: Fail arahan ini akan defrag dan membersihkan komputer WSUS lama dan kemas kini.

:: Untuk jadual, salin ke folder Program Program tempatan pada WSUS Server dan gunakan Scheduler Tugas untuk menjadualkan
:: Penjadual Tugas hanya akan melaksanakan tugas dari pemacu keras tempatan.

:: Sql Server Express Management Studio dan Powershell 2.0 atau lebih baru mesti dipasang di pelayan WSUS juga.

:: Untuk hasil terbaik lari skrip ini setiap malam hanya selepas tengah malam
:: Untuk mengkonfigurasi Penjadual Tugas Windows lakukan perkara berikut:
:: Tambah akaun Pentadbir domain kepada kumpulan Pentadbir WSUS tempatan dan WSUS Pelaporan
:: Untuk Server 2012 R2 menetapkan tugas untuk dijalankan dengan Keistimewaan Bertingkat

setlocal

:: Kirakan fail log harian
untuk / F "token = 2" %% a dalam ('tarikh / t') menetapkan tarikh = %% a
untuk / F "token = 1, 2, 3 delims = /" %% a ("% date%") menetapkan tarikh = %% c %% a %% b
tetapkan logfile = "c: Log WSUS_Cleanup \% username% on% computername% -% date% .txt"
mkdir c: Logs
mkdir c: Logs WSUS_Cleanup

masa / T >>% logfile%
echo Memulakan Pembersihan WSUS >>% logfile%

:: WSUS dengan cepat menyusun pangkalan datanya. Defrag terlebih dahulu.
:: Gunakan hanya pernyataan sqlcmd untuk versi WSUS di pelayan ini.
echo Defrag SUSDB >>% logfile%

:: Server 2012 R2 (WSUS 6.0)
sqlcmd -S . pipe MICROSOFT ## WID tsql query -i ". ReindexDatabaseIndexes.sql" >>% logfile%

:: Server 2003 (WSUS 3.0)
sqlcmd -S . pipe MSSQL $ MICROSOFT ## SSEE sql query -i ". ReindexDatabaseIndexes.sql" >>% logfile%

masa / T >>% logfile%

:: Sekarang bersihkan tuan rumah
echo Bersihkan komputer WSUS lama dan kemas kini >>% logfile%
powershell -ExecutionPolicy Unrestricted-File ". WSUS_Cleanup.ps1" >>% logfile%
masa / T >>% logfile%

:: Membersihkan WSUS juga serpihan pangkalan data. Jalankan skrip defrag sekali lagi. Ini sepatutnya agak cepat
echo Defrag SUSDB setelah database membersihkan >>% logfile%
:: Server 2012 R2 (WSUS 6.0)
sqlcmd -S . pipe MICROSOFT ## WID tsql query -i ". ReindexDatabaseIndexes.sql" >>% logfile%

:: Server 2003 (WSUS 3.0)
sqlcmd -S . pipe MSSQL $ MICROSOFT ## SSEE sql query -i ". ReindexDatabaseIndexes.sql" >>% logfile%

masa / T >>% logfile%

endlocal
keluar / b 0

========== ReindexDatabaseIndexes.sql =========
- http://www.sqlmusings.com/2009/03/15/a-more-effective-selective-index-rebuildreorganize-strategy/

PENGGUNAAN SUSDB - pernyataan telah dilaksanakan terlebih dahulu.
GO

SET NOCOUNT ON

- disesuaikan daripada "Membangun semula atau menyusun semula indeks (dengan konfigurasi)" dari MSDN Books Online
- (http://msdn.microsoft.com/en-us/library/ms188917.aspx)

-- =======================================================
- || Pembolehubah konfigurasi:
- || - 10 ialah titik keputusan yang sewenang-wenang di mana untuk
- || menyusun semula indeks.
- || - 30 ialah titik keputusan yang sewenang-wenang di mana untuk
- || beralih daripada menyusun semula, untuk membina semula.
- || - 0 ialah faktor isi lalai. Tetapkan ini kepada a
- || nilai dari 1 hingga 99, jika diperlukan.
-- =======================================================
DECLARE @reorg_frag_thresh float SET @reorg_frag_thresh = 10.0
DECLARE @rebuild_frag_thresh float SET @rebuild_frag_thresh = 30.0
DECLARE @fill_factor tinyint SET @fill_factor = 80
DECLARE @report_only bit SET @report_only = 0

- tambah (DS): page_count_thresh digunakan untuk memeriksa berapa banyak halaman yang digunakan oleh jadual semasa
DECLARE @page_count_thresh smallint SET @page_count_thresh = 1000

- Pembolehubah yang diperlukan untuk pemprosesan.
DECLARE @objectid int
DECLARE @indexid int
DECLARE @partitioncount bigint
DECLARE @schemaname nvarchar (130)
DECLARE @objectname nvarchar (130)
DECLARE @indexname nvarchar (130)
DECLARE @partitionnum bigint
DECLARE @partitions bigint
DELETE @frag float
DECLARE @page_count int
DECLARE @command nvarchar (4000)
DECLARE @intentions nvarchar (4000)
DECLARE @table_var TABLE (
int objectid,
indeks int,
partitionnum int,
terapung,
int page_count
)

- Selesa pilih jadual dan indeks dari
- fungsi sys.dm_db_index_physical_stats dan
- menukarkan objek dan indeks ID ke nama.
MASUKKAN KE DALAM
@table_var
PILIH
[object_id] AS objekid,
[index_id] AS indeks,
[partition_number] SEBAGAI partitionnum,
[avg_fragmentation_in_percent] SE,
[page_count] AS page_count
DARIPADA
sys.dm_db_index_physical_stats (DB_ID (), NULL, NULL, NULL, 'TERHAD')
WHERE
[avg_fragmentation_in_percent]> @reorg_frag_thresh
DAN
page_count> @page_count_thresh
DAN
index_id> 0


- Nyatakan kursor untuk senarai partition yang akan diproses.
DISKASAN partisi CURSOR FOR
PILIH * DARI @ meja_var

- Buka kursor.
Partisyen terbuka

- Gelung melalui sekatan.
WHILE (1 = 1) BEGIN
FETCH NEXT
DARI partisyen
INTO @objectid, @indexid, @partitionnum, @frag, @page_count

IF @@ FETCH_STATUS <0 BREAK

PILIH
@objectname = QUOTENAME (o. [nama]),
@schemaname = QUOTENAME (s. [nama])
DARIPADA
sys.objects AS o WITH (NOLOCK)
JOIN sys.schemas sebagai s DENGAN (NOLOCK)
ON s [schema_id] = o. [Schema_id]
WHERE
o. [object_id] = @objectid

PILIH
@indexname = QUOTENAME ([nama])
DARIPADA
sys.indexes WITH (NOLOCK)
WHERE
[object_id] = @objectid DAN
[index_id] = @indexid

PILIH
@partitioncount = count (*)
DARIPADA
sys.partitions WITH (NOLOCK)
WHERE
[object_id] = @objectid DAN
[index_id] = @indexid

- Bina pernyataan yang diperlukan secara dinamik berdasarkan pilihan dan statistik indeks.
SET @intentions =
@schemaname + N '.' +
@objectname + N '.' +
@indexname + N ':' + CHAR (13) + CHAR (10)
SET @intentions =
Ganti (SPACE (LEN (@intentions)), '', '=') + CHAR (13) + CHAR (10) +
@intentions
SET @intentions = @intentions +
N 'FRAGMENTATION:' + CAST (@frag AS nvarchar) + N '%' + CHAR (13) + CHAR (10) +
N 'PAGE COUNT:' + CAST (@page_count AS nvarchar) + CHAR (13) + CHAR (10)

JIKA @frag <@rebuild_frag_thresh BEGIN
SET @intentions = @intentions +
N 'OPERATION: REORGANIZE' + CHAR (13) + CHAR (10)
SET @command =
N'ALTER INDEX '+ @indexname +
N 'ON' + @schemaname + N '.' + @objectname +
N 'REORGANIZE; '+
N 'STATISTIK UPDATE' + @schemaname + N '.' + @objectname +
N '' + @indexname + ';'

END
IF @frag> = @rebuild_frag_thresh BEGIN
SET @intentions = @intentions +
N 'OPERATION: REBUILD' + CHAR (13) + CHAR (10)
SET @command =
N'ALTER INDEX '+ @indexname +
N 'ON' + @schemaname + N '.' + @objectname +
N 'REBUILD'
END
IF @partitioncount> 1 BEGIN
SET @intentions = @intentions +
N 'PARTITION:' + CAST (@partitionnum AS nvarchar (10)) + CHAR (13) + CHAR (10)
SET @command = @command +
N 'PARTITION =' + CAST (@partitionnum AS nvarchar (10))
END
IF @frag> = @rebuild_frag_thresh AND @fill_factor> 0 AND @fill_factor <100 BEGIN
SET @intentions = @intentions +
N 'FILL FACTOR:' + CAST (@fill_factor AS nvarchar) + CHAR (13) + CHAR (10)
SET @command = @command +
N 'WITH (FILLFACTOR =' + CAST (@fill_factor AS nvarchar) + ')'
END

- Melaksanakan operasi yang ditentukan, atau melaporkan niat
IF @report_only = 0 BEGIN
SET @intentions = @intentions + N 'EXECUTING:' + @command
PRINT @intentions
EXEC (@command)
END ELSE BEGIN
PRINT @intentions
END
PRINT @command

END

- Tutup dan deallocate kursor.
CLOSE partitions
BAHAWASAN MENGANDUNGKAN

GO

================ WSUS_Cleanup.ps1 ==============
#Dibandingkan dari https://gallery.technet.microsoft.com/scriptcenter/WSUS-Clean-Powershell-102f8fc6

#Region VARIABLES

# Parameter Pembersihan:
# Mengurangkan kemas kini yang belum diluluskan selama 30 hari atau lebih, tidak diperlukan pada masa ini oleh mana-mana pelanggan, dan diganti oleh pembaruan yang diluluskan.
# Ini ialah kotak semak dalam GUI Pelayan Bersih
[Boolean] $ supersededUpdates = $ Benar
# Menolak kemas kini yang tidak diluluskan dan telah tamat tempoh Microsoft saya.
[Boolean] $ expiredUpdates = $ Benar
# Padamkan kemas kini yang telah tamat tempoh dan belum diluluskan selama 30 hari atau lebih.
[Boolean] $ obsoleteUpdates = $ Benar
# Padamkan semakan kemas kini yang lebih lama yang belum diluluskan selama 30 hari atau lebih.
[Boolean] $ compressUpdates = $ Benar
# Padam komputer yang tidak dihubungi oleh pelayan dalam 30 hari atau lebih.
[Boolean] $ obsoleteComputers = $ Benar
# Padamkan fail kemas kini yang tidak diperlukan oleh pelayan kemas kini atau pelayan hiliran.
[Boolean] $ unneededContentFiles = $ Benar

#EndRegion VARIABLES

#Region SCRIPT

# Beban perhimpunan. NET
[void] [reflection.assembly] :: LoadWithPartialName ("Microsoft.UpdateServices.Administration")

# Sambung ke WSUS Server
# $ Wsus = [Microsoft.UpdateServices.Administration.AdminProxy] :: getUpdateServer ($ updateServer, $ useSecureConnection, $ portNumber)
$ Wsus = [Microsoft.UpdateServices.Administration.AdminProxy] :: getUpdateServer ()

# Lakukan Bersihkan
$ CleanupManager = $ Wsus.GetCleanupManager ()
$ CleanupScope = New-Object Microsoft.UpdateServices.Administration.CleanupScope ($ supersededUpdates, $ expiredUpdates, $ obsoleteUpdates, $ compressUpdates, $ obsoleteComputers, $ unneededContentFiles)
$ CleanupManager.PerformCleanup ($ CleanupScope)

#EndRegion SCRIPT
===============

Saya telah melihat banyak skrip untuk membersihkan pelayan WSUS tetapi akhirnya mereka gagal dengan tamat masa. Alasannya adalah tidak satu pun dari mereka mengembalikan / membina indeks pangkalan data WSUS. Ini juga mengapa skrip ini mesti dijalankan pada setiap pelayan WSUS dalam persekitaran anda - Pangkalan Data Dalaman Windows tidak menerima sambungan rangkaian. Saya reindex kedua-dua sebelum dan selepas pembersihan sebenar kerana saya telah melihat fragmen WSUS / SUSDB indeks secara drastik semasa pembersihan.

Sekiranya anda belum membuat sebarang penyelenggaraan pangkalan data pada pelayan WSUS anda, kali pertama skrip ini berjalan, ia mungkin mengambil masa beberapa jam untuk diselesaikan, dan mengandaikannya tidak meluangkan masa. Hanya teruskan semula sehingga selesai. Masa pemprosesan malam yang biasa sejak saya mula menggunakannya kurang dari lima minit.

Satu nota pada skrip perintah - "::" adalah sebuah dokumen yang tidak boleh didokumentasikan, boleh diguna semula, dan merupakan pernyataan REM yang jauh lebih pantas untuk bahasa perintah windows. Parser perintah tingkap akan cuba mengurai garisan lengkap untuk penyataan REM dan kemudian membuang dan membuang ralat dalaman. Baris label hanya dihuraikan ke ruang pertama dalam barisan dan sisanya baris diabaikan. Menggunakan "::" sebagai pernyataan REM tidak didokumentasikan tetapi perilaku ini tidak berubah sejak PC-DOS 1.0.