Etiket arşivi: Windows PowerShell

Remote Powershell özelliği ile Windows’ları tek noktadan yönetin!

Uzun zamandır işlerimin yoğunluğundan dolayı siteye vakit ayıramadım. Her gün neredeyse sabah 9, gece 3-4 çalışmaya başladık. Bu çalışmalarım sırasında öğrendiğim, geliştirdiğim bir çok yeni teknoloji ve yapı vardı. Aslında baya bir malzeme çıktı bana yazacak fakat yazacak vakit bulamıyorum.

Radore için geliştirmeye başladığım XiW projesinde, tüm Windows sunucuların tek noktadan yönetilmesi planlanıyoruz. Böylece hiç bir sunucu üzerinde ekstra bir yük olmadan bu sunucular üzerinde düzenlemeler ve güncellemeler yapabileceğiz. Yakında üzerinde uzun uzun duracağım bir özelliği kullandım: Remote Powershell

Remote Powershell ile uzaktaki Windows sunucuları, sanki local makinayı yönetiyormuş gibi yönetebiliyorsunuz. Aynı Active Directory yapısında bulunan sunucuları, herhangi bir authentication sorunu yaşamadan yönetebilmeniz harika bir gelişme oldu sistem dünyası için. Önümüzdeki günlerde Remote Powershell scriptlerinin bir bölümünü yayınlamayı planlıyorum.

Yarın sabah 9′da (4 saat sonra yani) mesai başı yapacağım için bu gecelik bu kadar. Kolay gelsin..

Microsoft Windows DHCP loglarının FTP üzerinden arşivlenmesi

5651 yasasıyla birlikte, ofisinize ait DHCP loglarını 6 aylık bir süre boyunca imzalayarak saklamanız gerekiyor. DHCP servisi, farklı bir sunucu üzerinde bulunuyorsa, DHCP loglarını Powershell sayesinde herhangi bir FTP programına ihtiyaç olmadan imzalama yapacağınız sunucuya gönderebilirsiniz. Bu işlem ile sadece DHCP loglarının değil HTTP loglarının da arşivlenmesini sağlayabilirsiniz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 5651 Log Sender
# Yusuf Ozturk - https://www.yusufozturk.info
# In God We Trust, All Others We Use Powershell
 
# Get Yesterday
$Day = Get-Date -uformat %A
$Date = (Get-Date).AddDays(-1).ToString("yyyyMMdd")
 
If ($Day -eq "Pazar")
{
$Day = "Sat"
}
ElseIf ($Day -eq "Cumartesi")
{
$Day = "Fri"
}
ElseIf ($Day -eq "Cuma")
{
$Day = "Thu"
}
ElseIf ($Day -eq "Perşembe")
{
$Day = "Wed"
}
ElseIf ($Day -eq "Çarşamba")
{
$Day = "Tue"
}
ElseIf ($Day -eq "Salı")
{
$Day = "Mon"
}
ElseIf ($Day -eq "Pazartesi")
{
$Day = "Sun"
}
 
# Get DHCP IPV4
$DHCPV4Log = "C:\Windows\System32\dhcp\DhcpSrvLog-" + $Day + ".log"
 
# Get DHCP IPV6
$DHCPV6Log = "C:\Windows\System32\dhcp\DhcpV6SrvLog-" + $Day + ".log"
 
# FTP Paths
$DHCPv4Dir = "ftp://username:password@yusufozturk.info/Data/RH_Ofis_DHCPv4_" + $Date + ".log"
$DHCPv6Dir = "ftp://username:password@yusufozturk.info/Data/RH_Ofis_DHCPv6_" + $Date + ".log"
 
# Prepare Files
$Webclient = New-Object System.Net.WebClient 
$DHCPv4Uri = New-Object System.Uri($DHCPv4Dir)
$DHCPv6Uri = New-Object System.Uri($DHCPv6Dir)
 
# Send to Log Server
$Webclient.UploadFile($DHCPv4Uri, $DHCPv6Log)
$Webclient.UploadFile($DHCPv6Uri, $DHCPv4Log)

Yukarda dikkat etmeniz gereken nokta, DHCP loglarının tarihe göre değil günlere göre tutulduğudur. Sistem lokasyonu Türkiye olduğu için Get-Date yaptığınızda Pazartesi gibi gelecektir günler. Bu yüzden her güne karşılık olarak bir önceki günün İngilizce adını yazdım. Böylece bu scripti Cronjob ile her gece saat 3 gibi çalıştırmanız durumunda, hep bir önceki günün loglarını FTP üzerinden sunucuya gönderecektir. Kolay gelsin.

Powershell’de tarih işlemleri ve hesaplamalar – 1

Derslerim ve projelerim sebebiyle uzunca bir süredir yazı ekleyemiyordum. Gerçi yine vakit darlığından ve yoğunluktan dolayı çok ayrıntıya giremeyeceğim fakat Powershell ile aşağıdaki komutlar sayesinde tarih işlemleri yapabilirsiniz.

Temel komut
Get-Date: Bu komut sayesinde bir çok tarih işlemini gerçekleştirmiş olacağız. Bu komutu yazdığınızda, bugünün tarihini görmüş olursunuz.

Çıktısı:
05 Ocak 2010 Salı 19:25:15

Yalnız yukardaki çıktı, scriptlerde hiç bir işimize yaramayacaktır. Bu nedenle bu çıktıyı biraz değiştirelim.

1
2
PS C:\Users\yusufozturk.info> get-date -uformat %d.%m.%Y
05.01.2010

Böylece daha kullanışlı bir çıktı elde etmiş olduk. Şimdi de 3 gün öncesinin tarihini görmeye bakalım.

1
2
PS C:\Users\yusufozturk.info> (get-date).AddDays(-3)
02 Ocak 2010 Cumartesi 19:28:38

Şimdi yukardaki çıktıyı da kullanışlı hale getirelim. Yalnız bunu biraz daha farklı bir yoldan yapıyoruz.

1
2
PS C:\Users\yusufozturk.info> (get-date).AddDays(-3).ToString("dd.MM.yyyy")
02.01.2010

Eğer ayı ya da günü tek basamak almak isterseniz ya da yılı 2 haneli olarak görmek istiyorsanız, “yyyy” gibi olan kısmı “yy” olarak ya da “dd” gibi olan kısmı “d” yapmanız yeterli olacaktır.

Bunların dışında daha detaylı bilgiye;

1
get-help get-date -full

yazarak ulaşabilirsiniz. Umarım işinize yaramıştır. İyi çalışmalar.

Windows Server 2008 R2 Advanced Firewall Yönetimi

Windows Server 2008 R2′deki Advanced Firewall’un CMD üzerinden nasıl yönetilebileceğini bilmek ister misiniz? Şimdi bazı önemli senaryoları aşağıya eklemeye çalışacağım. İnternette pek bulabileceğiniz tipten senaryolar değil, çünkü kendim ürettim ve kendim yazdım kodlarını 🙂

Senaryonun temelinde, firewall üzerinde scope yapılandırmaları yatıyor. Şimdi yusufozturk.info web sunucusuna gelen erişimleri, advanced firewall ile nasıl sınırlandırabileceğimizi görelim.

10.10.10.1 nolu ip’den icmp isteklerine izin vermek (tüm icmp kapalı durumdayken)

netsh advfirewall firewall add rule name="kural1 ICMPv4" dir=in protocol=icmpv4 new remoteip=10.10.10.1 enable=yes action=allow profile=Public

10.10.10.1 nolu ip’den icmp isteklerini engellemek (tüm icmp açık durumdayken)

netsh advfirewall firewall add rule name="kural2 ICMPv4" dir=in protocol=icmpv4 new remoteip=10.10.10.1 enable=yes action=block profile=Public

10.10.10.0/24 nolu ip bloğundan gelecek olan tüm icmp isteklerini engellemek

netsh advfirewall firewall add rule name="kural3 ICMPv4" dir=in protocol=icmpv4 new remoteip=10.10.10.0/24 enable=yes action=block profile=Public

10.10.10.0/24 nolu ip bloğundan gelecek olan tüm icmp isteklerine izin vermek

netsh advfirewall firewall add rule name="kural4 ICMPv4" dir=in protocol=icmpv4 new remoteip=10.10.10.0/24 enable=yes action=allow profile=Public

Yukardaki örneklere uygun olarak senaryolar arttırılabilir. Örneğin belirli ip’ler için Remote Desktop erişimi açmak, diğer tüm iplere kapatmak ya da sadece belli ip’lerin SQL’e erişebilmesini sağlamak gibi. Şahsen ben Powershell ile EventLog’ları çekip, Brute Force yapan ip’leri bu komutlar ile otomatik olarak engellemek için kullanacağım.

Exchange Server 2010 – Gönderi limitleri belirleme (Powershell)

Exchange Server 2010 üzerinde aşağıdaki function ile gönderi limitlerini belirleyebilirsiniz.

1
2
3
4
5
6
7
Function Maxsize-Limits
{
Param ($FirstName, $LastName, $CustomerOU, $MaxSendSize, $MaxReceiveSize)
     $ADDomain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
     $ADDomain = $ADDomain.Name
     Set-Mailbox –MaxSendSize "$MaxSendSize" -MaxReceiveSize "$MaxReceiveSize" -Identity "$ADDomainName/$CustomerOU/$FirstName $LastName"
}

Kullanımı:

Maxsize-Limits –FirstName "$FirstName" –LastName "$LastName" –CustomerOU "$CustomerOU" –MaxSendSize "10 MB" -MaxReceiveSize "10 MB"

Yukardaki komut sayesinde, kullanıcının alabileceği ve gönderebileceği maksimum mail boyutunu, 10 mb olarak belirlemiş durumdayız.

Exchange Server 2010 – Yeni mail adresleri tanımlama (Powershell)

Exchange Server 2010 üzerinde aşağıdaki function ile kullanıcılara yeni mail adresleri tanımlayabilmekteyiz.

1
2
3
4
5
6
7
function Add-MailAddress
{
Param ($MailAddress, $FirstName, $LastName, $CustomerOU)
    $ADDomain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
    $ADDomain = $ADDomain.Name
    Set-Mailbox -EmailAddresses "SMTP:$MailAddress" -EmailAddressPolicyEnabled $false -Identity "$ADDomainName/$CustomerOU/$FirstName $LastName"
}

Kullanımı:

Add-MailAddress –MailAddress "$MailAddress" –FirstName "$FirstName" –LastName "$LastName" -CustomerOU "$CustomerOU"

Mail adresi tanımlama kısmında dikkat etmeniz gereken kısım SMTP olacaktır. SMTP’yi büyük harflerle yazmanız halinde, girilen mail adresi default; küçük harflerle yazılması halinde, girilen mail adresi ikincil mail adresi olacaktır. Örneğin bir kaç mail adresi tanımlanacaksa bir kullanıcıya aşağıdaki Powershell komutunu çalıştırmanız gerekecektir.

1
2
3
$ADDomain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$ADDomain = $ADDomain.Name
Set-Mailbox -EmailAddresses "SMTP:$MailAddress1", "smtp:$MailAddress2", "smtp:$MailAddress3" -EmailAddressPolicyEnabled $false -Identity "$ADDomainName/$CustomerOU/$FirstName $LastName"

Yukarda görüldüğü gibi $MailAddress1 kullanıcının default reply adresi olacak, diğer mail adresleri ise kullanabileceği ikincil adresler olacaktır.

Exchange Server 2010 – Mail Hesabı Ekleme işlemi (Powershell)

Exchange Server 2010 üzerinde aşağıdaki function ile mail hesabı yaratabilirsiniz.

1
2
3
4
5
6
7
function Add-MailUser
{
Param ($UserID, $FirstName, $LastName, $CustomerOU)
    $ADDomain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
    $ADDomainName = $ADDomain.Name
    Enable-Mailbox -Identity "$ADDomainName/$CustomerOU/$FirstName $LastName" -Alias "$UserID"
}

Kullanımı:

Add-MailUser –UserID "$UserID" –FirstName "$FirstName" –LastName "$LastName" -CustomerOU "$CustomerOU"

Function dosyası kullanmamızın en büyük faydası, mail hesabını daha hızlı bir şekilde açmak olacaktır.

Creating a new mailbox with Powershell function on Exchange Server 2010

I wrote a function for Hosted Exchange 2010 to create a new mailbox on Exchange Server 2010.

1
2
3
4
5
6
7
function Add-MailUser
{
Param ($UserID, $FirstName, $LastName, $CustomerOU)
    $ADDomain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
    $ADDomainName = $ADDomain.Name
    Enable-Mailbox -Identity "$ADDomainName/$CustomerOU/$FirstName $LastName" -Alias "$UserID"
}

Usage of function:

Add-MailUser –UserID “2452” –FirstName “Yusuf” –LastName “Ozturk” -CustomerOU “Users”

I used System.Directory.Services to get Active Directory domain. Lets see how does it work:

dservices

CustomerOU is the base of your user container. Just type your OU name like “Exchange” or “Users”.

How can you find your attached iso image with Powershell using SCVMM?

I got a question about ISO feature on Technet forums today.

Jan Marek:

Ok. But I have 200 virtual machines and I want to create a new one and use iso for virtual dvd rom. It is not working because I already use it for another server. How can I find from which one I should disconnect this iso?

Really good question I think. Because as I know, you can’t find it with SCVMM console. Also checking all virtual machines one by one is a way but it could be a nightmare, if you have so many virtual machines.

I wrote a Powershell script for Jan. I want to share:

1
2
3
4
5
6
7
8
9
$all = Get-VM *
foreach ($i in $all)
{
$iso = $i | Get-VirtualDVDDrive | Select-Object ISO
if ($iso -like "*test*")
{
write-host VM: $i
}
}

If your ISO name is “debian.iso”, just replace “test” with “debian”.

Also if you use just “Get-ISO”, you can see all iso images on all virtual machines.

You can reach that post from here:

If we can see them with SCVMM console, please let me know.

Adding file and secondary IP to remote host with Powershell

You need to add secondary ip to external host? You only need to Powershell and Psexec. Psexec is a small and free program. You can download Psexec from Microsoft Technet. It works great!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# VM Config Tool
# Created By Yusuf Ozturk
# In God We Trust, All Others We Use Powershell
 
# PsTools: https://technet.microsoft.com/en-us/sysinternals/bb897553.aspx
 
$VMName = Get-VM VDS*
 
foreach ($VM in $VMName)
{
    $IP = ($VM.Name).TrimStart('VDS00')
 
    $Server = "10.10.10." + $IP
 
    $IP1 = "10.10.11." + $IP
    $IP2 = "10.10.12." + $IP
    $IP3 = "10.10.13." + $IP
 
    $PSExecPath = "\\10.10.10.2\yusufozturk$\PsTools\psexec.exe"
 
    $Command1 = "netsh interface ipv4 add address ""Local Area Connection"" $IP1 255.255.255.0"
    $Command2 = "netsh interface ipv4 add address ""Local Area Connection"" $IP2 255.255.255.0"
    $Command3 = "netsh interface ipv4 add address ""Local Area Connection"" $IP3 255.255.255.0"
    $Command4 = "xcopy \\10.10.10.2\yusufozturk$\IIS\default.asp C:\inetpub\wwwroot\"
 
    $Shell1 = $PSExecPath + " \\" + $Server + " -u Administrator -p Password123 " + $Command1
    $Shell2 = $PSExecPath + " \\" + $Server + " -u Administrator -p Password123 " + $Command2
    $Shell3 = $PSExecPath + " \\" + $Server + " -u Administrator -p Password123 " + $Command3
    $Shell4 = $PSExecPath + " \\" + $Server + " -u Administrator -p Password123 " + $Command4
 
    cmd.exe /c $Shell1
    cmd.exe /c $Shell2
    cmd.exe /c $Shell3
    cmd.exe /c $Shell4
 
}

You need to add /c switch for cmd.exe to execute scripts in a script. You need to accept Eula of Psexec first.