Blog

Tavsiye Ettiğim Bazı Powershell Scriptleri

Powershell, Microsoft tarafından cmd.exe uygulamasına alternatif olarak geliştirilmiş son derece kullanışlı bir komut satırı uygulamasıdır.

Bu yazımızda tavsiye edilen bazı Powershell scriptlerini inceleyeceğiz.

İşletim Sistemine Göre AD Bilgisayar Sayılarını Bulma

Sistem yöneticilerinin özellikle lisans denetimleri öncesinde ve anti virüs yazılımları gibi bütün makinelere kurulacak sistemler öncesi saha analizinde işletim sistemlerine göre bilgisayar sayıları ihtiyaç duydukları hayati bilgilerden biri olabiliyor. AD’ye ilişkin hemen hemen her soruya cevap veren PowerShell ile bunun cevabını vermek de son derece basittir. Aşağıdaki powershell scripti ile yukarıdaki ekran görüntüsünde göründüğü gibi bilgisayar sayıları kolaylıkla elde edilebilir.

# AD modulünün eklenmesi
Import-Module ActiveDirectory
 
# Domain adını bulma
$DomainName = (Get-ADDomain).NetBIOSName 
 
# Kaç gün öncesine kadar oturum açmış makineleri sorgula
$days = 30
$lastLogonDate = (Get-Date).AddDays(-$days).ToFileTime()
 
# AD sorgulama
$Computers = @(Get-ADComputer -Properties Name,operatingSystem,lastLogontimeStamp -Filter {(OperatingSystem -like "*Windows*") -AND (lastLogontimeStamp -ge $lastLogonDate)})
foreach($Computer in $Computers)
{
    $Computer.OperatingSystem = $Computer.OperatingSystem -replace '®' -replace '™' -replace '专业版','Professional (Ch)' -replace 'Professionnel','Professional (Fr)'
}
 
$Computers | Group-Object operatingSystem | Select Count,Name | Sort Name | Out-GridView

Uzaktan DNS Adresi Değiştirme

Sistem yöneticileri için network yapısı ve içerisinde yer alan cihazların çalışma sürekliliği ön plandadır. Bazı durumlarda uzakta yer alan cihazların (Windows için) DNS ayarlarının değiştirilmesi gerekmektedir. Aşağıda yer alan Powershell scriptini kullanarak uzak bilgisayarın DNS ayarlarını değiştirebilirsiniz.

  • İlk satırda yer alan “C:\list\servers.txt” dosyası DNS ayarları değiştirilecek makinelerin IP adresleri veya isimleri yer alıyor. Dosya yapısı her satıra bir makine bilgisi gelecek şekilde düzenlenmelidir.
  • $DNSServers = “10.1.0.254”,”10.1.0.253″ satırında da verilecek yeni DNS IP adresleri veriliyor. Bu örneğimizde 254 IP adresi birinci DNS, 253 IP adresi de ikinci DNS olarak ayarlanacak.
$computer = get-content C:\list\servers.txt 
 
$NICs = Get-WMIObject Win32_NetworkAdapterConfiguration -computername $computer |where{$_.IPEnabled -eq “TRUE”} 
 
  Foreach($NIC in $NICs) { 
$DNSServers = "10.1.0.254","10.1.0.253"
 $NIC.SetDNSServerSearchOrder($DNSServers) 
 $NIC.SetDynamicDNSRegistration(“TRUE”) 
 
}

Sistemde Oturum Açan Hesabın Sorgulanması

Sistem yöneticilerinin, sistemi yönetirken bilmeleri gereken bilgilerden biri de hangi bilgisayarda hangi hesabın oturum açtığı bilgisidir. Bu bilgiye basit bir powershell komutu ile ulaşabiliriz.

$select = "E"
 
do
{
$computer=read-host "Bilgisayar adı / IP Girin" 
if (Test-Connection -ComputerName $computer -Quiet -Count 2 -Delay 1)
{
gwmi win32_computersystem -comp $computer | select USername,Caption,Manufacturer,Model | out-host
} else { Write-Host "$computer makinesine ulaşılamıyor" -ForegroundColor Red | Out-Host }
$select = Read-Host "Başka bilgisayar sorgulama için E basın"
$select
}
while ($select -eq "E")

DHCP Sunucusundan IP Silme

IP bloklarının verebildiği IP adres sayılarının yetersiz olduğu durumda bazı IP adreslerinin DHCP’den silinmesi gerekmektedir. Adresleri tek tek silinebileceği gibi bir Powershell scripti ile toplu da silinebilir. Aşağıda yer alan Powershell scriprti kullanılarak belli şartları sağlayan IP adreslerini kolaylıkla silebiliriz. Script active directory kullanıcısının yetkiye sahip olması durumunda kendi bilgisayarında da çalıştırabilir. Aşağıdaki örnek scripte isminde android, galaxy veya phone geçen ve rezerve olmayan IP adresleri siliniyor.

$message = New-Object -ComObject wscript.shell
$dhcpServer = Read-Host "DHCP IP Adresi Giriniz"
$scopeId = Read-Host "Temizlenecek Scope IP Adresi Giriniz"
 
$ipList = Get-DhcpServerv4Lease -ComputerName $dhcpServer -ScopeId $scopeId | where {($_.HostName -like 'android*' -or $_.HostName -like '*phone*' -or $_.HostName -like '*galaxy*') -and $_.AddressState -NOTlike '*Reservation*'}
 
Write-Host "Silinecek IP Sayıları"
 
Write-Host "Android Sayısı: " + ($ipList | where {$_.HostName -like 'android*' -or $_.HostName -like '*galaxy*'}).Count
 
Write-Host "IPhone Sayısı: " + ($ipList | where {$_.HostName -like '*phone*'}).Count
Write-Host "Toplam: " + $ipList.Count
 
$confirm = $message.popup("IP adresleri DHCP üzerinden silinecektir. Onaylıyor musunuz?",0 ,"IP Adresini Sil", 4)
 
if ($confirm -eq 6)
{
$ipList | Remove-DhcpServerv4Lease -ComputerName $dhcpServer
$message.Popup("IP adresleri silinmiştir.", 0, "Bilgi", 0)
}

OU Yapısını Başka Bir Domain’e Kopyalama

Active Directory ile uğraşan arkadaşlar bazı sebeplerden dolayı OU yapısını başka bir sunucuya kopyalamak isteyebilirler. Bu işlem için aşağıdaki powershell kodları kullanılabilir. Kodların çalışması için powershelle activedirectory modülünün tanıtılmış olması gerekmektedir.

Öncelikle aşağıdaki kod ile mevcut yapı bir txt dosyasına alınır.

$ou= Get-ADOrganizationalUnit -Filter * -SearchBase “OU=LAB,DC=LAB,DC=SE”; $ou.DistinguishedName > ou.txt

Burada “OU=LAB” ifadesinde LAB yerine dışarı aktarılacak OU adı, DC ifadelerinde de LAB yerine domain adı, SE yerine de domain uzantınızı yazınız.

Daha sonra da hedef domainde aşağıdaki kod çalıştırılarak OU yapısı taşınmış olur.

# OU yapısını tutan dosya
$ou=Get-Content -Path C:\temp\OU.txt
# Dosyadan verileri satır satır okuma
 
foreach ($iou in $ou) 
{ 
$path="" 
$sou=$iou.Split(",")
$nou=$sou.Split("=")
$name=$nou[1]
 
#  Create OU path
for ($i=1; $i -lt $sou.count; $i++)
{
if  ($path-eq"")
{
$path=$sou[$i]
}
else
{
$path=$path + "," + $sou[$i]
}
}
 
Write-Host "Creating: $name - $path"
 
# Create OU structure
New-ADOrganizationalUnit -Name $name -Path "$path"
}

Uzak Bilgisayarda Paylaşılan Klasörleri Bulma

Powershell komutu ile uzaktaki herhangi bir Windows yüklü bilgisayarda paylaşıma açılmış klasörleri görüntüleyebiliriz. Bunun için gerekli olan kod parçası.

Get-WmiObject -Class Win32_Share -ComputerName [Ip Adres veya bilgisayar adı]

Aynı şekilde bu powershell komutunu C# ile çalıştırarak da bir arayüz üzerinden sonuçlar görüntülenebilir.
Bunun için gerekli olan C# kodu aşağıdadır.
Kod içerisinde kullanılan Shared isimli sınıfımızın kodu:

public class Share
 {
 public string ClientName { get; set; }
 public string SharedFolder { get; set; }
 }
using (PowerShell powerShell = PowerShell.Create())
{
try
{
powerShell.AddScript($"Get-WmiObject -Class Win32_Share -ComputerName {dhcpServerClient.IpAddress}");
Collection<PSObject> psObjects = powerShell.Invoke();
  
foreach (PSObject psObject in psObjects)
{
if (psObject!=null)
{
Shared shared = new Shared();
shared.ClientName = dhcpServerClient.Name;
shared.SharedFolder = psObject.BaseObject.ToString();
shareds.Add(shared);
}
}
}
catch (Exception ex)
{
}
}

Yazıcı Listesini Dosyaya Alma

Bilgisayarımıza tanımlı yazıcıların listesini .csv dosyasına almak için powershell komut yorumlayıcısını açarak aşağıdaki kodu çalıştıralım:

$printserver = "bilgisayar_adı"
Get-WMIObject -class Win32_Printer -computer $printserver | Select Name,DriverName,PortName | Export-CSV -path 'çıktının kaydedileceği yer'

İlgili Makaleler

Bir Yorum

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu