PowerShell: Get-Time ile Tüm Bilgisayarların Sistem Saatini alın ve izleyin
Active Directory etki alanınızda zaman senkronizasyonu ile ilgili sorunlarınız mı var yoksa yalnızca sunucularınızın, iş istasyonlarınızın veya etki alanı denetleyicilerinizin sistem saatini izlemek ve belirlemekle mi ilgileniyorsunuz? Cevabınız evet ise okumaya devam edin. Bu makalede, seçtiğiniz tek bilgisayarların veya etki alanına katılmış bir dizi bilgisayarın sistem saatini uzaktan alacak gelişmiş bir PowerShell işlevi sunacağım.
Amaç
Mümkün olduğu kadar basit olmasını istiyorum: Tek bir komutla Active Directory etki alanınızdaki tüm bilgisayarların veya belirli bilgisayarların sistem saatini alın. Hadi gidelim.
Yerel Sistem Saati
Basit bir şey, değil mi? Partiyi başlatalım.
Belirli bir Bilgisayarın Yerel Sistem Saati
Tüm Etki Alanı Denetleyicilerinin Yerel Sistem Saati
Şimdi bir adım daha ileri gidelim.
Tüm Etki Alanına Katılmış Windows Sunucularının Yerel Sistem Saati
Bu da beni asıl kısma, fonksiyonun kendisine getiriyor.
Get-Time
Bu bölüm yalnızca daha sonra ihtiyacınız olan kodu içerir. PowerShell oturumunuzda Get-Time'ı kullanmayla ilgili yardım için bir sonraki bölüme geçin.
function Get-Time {
# .SYNOPSIS
# Get-Time is an advanced Powershell function. It obtains the local system time of a scope of computers or the system time of particular remote computers.
# .DESCRIPTION
# Uses the buil-in function Get-Date. Define scope or computer name.
# .PARAMETER
# Scope
# Define the scope. Possible values: "AllServer", "DomainController", "Computer"
# .PARAMETER
# Computer
# Provide computer name of remote computer.
# .EXAMPLE
# Get-Time -Scope AllServer
# .NOTES
# Author: Patrick Gruenauer, MVP PowerShell
# Web: https://sid-500.com
[CmdletBinding()]
param
(
[Parameter(Mandatory=$false, HelpMessage='Enter the following values: AllServer, DomainController, Computer')]
[ValidateSet("AllServer", "DomainController", "Computer")]
$Scope,
[parameter(Mandatory=$false)]
$Computer="$env:Computername"
)
$server=(Get-ADComputer -Filter 'operatingsystem -like "*server*"-and enabled -eq "true"').Name
$dc=Get-ADDomainController -Filter * | Select-Object -ExpandProperty Name
$result=@()
switch ($Scope)
{
'AllServer' {
foreach ($s in $server) {
$t=Invoke-Command -ComputerName $s {Get-Date -Displayhint time | Select-Object -ExpandProperty DateTime} -ErrorAction SilentlyContinue
$result +=New-Object -TypeName PSCustomObject -Property ([ordered]@{
'Server'= $s
'Time' = $t
})}
}
'DomainController' {
foreach ($d in $dc) {
$t=Invoke-Command -ComputerName $d {Get-Date -Displayhint time | Select-Object -ExpandProperty DateTime} -ErrorAction SilentlyContinue
$result +=New-Object -TypeName PSCustomObject -Property ([ordered]@{
'Server'= $d
'Time' = $t
})}
}
}
If ($Computer -ne "$env:computername") {
Try {
$t=Invoke-Command -ComputerName $Computer {Get-Date -Displayhint time | Select-Object -ExpandProperty DateTime} -ErrorAction Stop
$result +=New-Object -TypeName PSObject -Property ([ordered]@{
'Computer'= $Computer
'Time' = $t
})
}
Catch {
$result+=New-Object -TypeName PSObject -Property ([ordered]@{
'Computer'=$Computer
'Time'='Computer could not be reached'
})
}
}
If (($computer -eq "$env:computername") -and ($scope -eq $null)) {
Get-Date -Displayhint time | Select-Object -ExpandProperty DateTime
}
Write-Output $result
}
Bu nasıl kullanılır
Yukarıdaki kodu PowerShell ISE'ye (ise.exe) kopyalayın ve kodu çalıştırın. Daha sonra komutu yazın ve onunla eğlenin.
İşlevin kalıcı olarak kullanılabilir olmasını istiyorsanız ve böylece PowerShell'i her başlattığınızda işlevin kullanılabilir olmasını istiyorsanız C:\Program Files\WindowsPowerShell\Modules konumunda bir klasör oluşturmanız gerekir. Klasöre Get-Time adını verin. Daha sonra kodu bu klasöre .psm1 dosyası olarak kaydedin. Aşağıdaki ekran görüntüsü size yardımcı olacaktır.




