Bu Blogda Ara

MS Exchange - Temel Powershell İşlemleri

Belirli sayıda obje (item) veya obje grubu üzerinde toplu olarak işlem yapabilmek için gui yerine power shell üzerinden işlem yapmak daha kolay olacaktır.

Bu makalede Exchange Sunucu üzerinde powershell kullanarak  basit bir takım işlemleri gerçekleştireceğiz.

Öncelikle bir komutu veya parametrelerini ezberlemek zorunda olmadığımız hatırlatmak isterim.

Mesela içinde mailbox geçen komutlar aklımıza gelmediyse;

Get-Command -name *mailbox* | more

veya get- ile başlayan komutları görmek istersek:

Get-Command -name get-* | more

get ile başlayıp içinde bir yerde mailbox geçen komutları listelemek içinse:

Get-Command -name get-*mailbox* | more

get-mailbox komutunun örneklerini görmek istersek;

Get-Help Get-Mailbox -Examples

Hangi parametreleri aldığını ve kullanım örneklerini birlikte görmek istersek;

Get-Help Get-Mailbox -Detailed

Komutun çıktısında değişkenlerin adlarını da ezberlemek zorunda değiliz.Komutun ardına fl * eklersek ilgili objeye ait tüm değişkenleri ve aldıkları değerlerin tamamını görürüz:

Get-Mailbox ahmet | fl *

Not: "fl" parametresi liste şeklinde, "ft" parametresi ise tablo halinde (değişkenler en üst sırada, değerleri altlarında) olacak şekilde listelemeyi sağlar.

1) Belirli bir OU altındaki kullanıcıları listelemek:
04_Bilgi_Islem OU'su altındaki mailbox'ları listeliyoruz ve isme göre sıralıyoruz:

Get-Mailbox -OrganizationalUnit 04_Bilgi_Islem | Sort-Object name

Name                      Alias                ServerName       ProhibitSendQuota
----                          -----                   ----------                -----------------
ahmet                  ahmet           xxxxx                3.4 GB (3,650,722,816 bytes)
mehmet               mehmet         xxxxx                3.4 GB (3,650,722,816 bytes)

Kaç adet olduklarını görmek istersek:
(Get-Mailbox -OrganizationalUnit 04_Bilgi_Islem).count
2

2) Bir OU altındaki kullanıcının belirli değişken değerlerini listelemek
04_Bilgi_Islem OU'su altındaki mailbox'ların sadece "Alias" , "ProhibitSendQuota"  ve "ProhibitSendReceiveQuota" değişkenlerine ait değerleri tablo şeklinde (ft) listelemek istiyoruz:

Not: Değişkenlerin adlarını ezberlemek zorunda değiliz. Komut içerisinde ilk önce "fl*"  parametresini kullanarak tüm değişken adlarını öğrenebiliriz.

Get-MailboxStatistics ahmet.mehmet | fl *Time*

LastLogoffTime : 11/28/2018 1:36:17 PM
LastLogonTime  : 11/28/2018 1:34:38 PM

Get-Mailbox -OrganizationalUnit 04_Bilgi_Islem
| ft Alias,ProhibitSendReceiveQuota,ProhibitSendQuota

Alias                           ProhibitSendReceiveQuota                ProhibitSendQuota
-----                          ------------------------                                -----------------
ahmet                            3.5 GB (3,758,096,384 bytes)           3.4 GB (3,650,722,816 bytes)
mehmet                        3.5 GB (3,758,096,384 bytes)            3.4 GB (3,650,722,816 bytes)


3)Tekil kullanıcının tüm değişkenlerini görmek:
Get-Mailbox ahmet | fl *

PSComputerName                              : xxxx.xxx.gov.tr
RunspaceId                                        : 175ff331-6c64-43b1-a388-d5b56ce2f507
Database                                            : Personel_db_1
UseDatabaseRetentionDefaults         : True
RetainDeletedItemsUntilBackup       : False
DeliverToMailboxAndForward          : True
LitigationHoldEnabled                       : False
SingleItemRecoveryEnabled              : False
RetentionHoldEnabled                       : False
(Sorgu sonucu uzun olduğundan tamamı burada gösterilmemiştir)


4) Tekil kullanıcıya ait bir değeri değiştirmek:
Ahmet kullanısının "Office" değişkenini "TAPDK" olarak değiştirmek istediğimizi düşünelim:

Sorgu yaptığımızda bu değer boş geliyor:

Get-Mailbox ahmet | fl office
Office :

Değeri değiştiriyoruz:
Get-Mailbox ahmet | Set-Mailbox -Office "TAPDK"

Tekrar sorguladığımızda "Office" değişkeninin artık "TAPDK" olduğunu göreceğiz:

Get-Mailbox ahmet | fl office
Office : TAPDK

Değeri boş olarak değiştirmek için:
Set-Mailbox ahmet -Office  $none

5) OU altındaki tüm mailbox'lara ait belirli bir değişkeni değiştirmek

Get-Mailbox -OrganizationalUnit 04_Bilgi_Islem  | Set-Mailbox -Office "TAPDK"

6) OU altında değişken değeri belirli bir değere eşit olan mailbox'ları listelemek
04_Bilgi_Islem OU'su altında "RecipientLimits" değişkeninin değeri 0 (sıfır) olan mailboxları listeleyelim:

Get-Mailbox -OrganizationalUnit 04_Bilgi_Islem 
| Where-Object {$_.RecipientLimits -eq 0} | ft alias,recipientlimits

Alias                                                       RecipientLimits
-----                                                       ---------------
ahmet                                                       0

7) OU altında değişken değeri belirli bir değere eşit olan mailbox'ları bulup bu değişken değerini değiştirmek
04_Bilgi_Islem OU'su altında "RecipientLimits" değişkeninin değeri 0 (sıfır) olan mailboxları listeleyip bu değişkenin değerini "unlimited" yapmak istiyoruz:


Get-Mailbox -OrganizationalUnit 04_Bilgi_Islem 

| Where-Object {$_.RecipientLimits -eq 0} | Set-Mailbox -Recipientlimits unlimited

Where-Object komut örnekleri:

Where-Object {$_.RecipientLimits -ceq 0}                      :Değer 0'a eşit
Where-Object {$_.RecipientLimits -cne 0}                     : Değer 0'a eşit değil
Where-Object {$_.RecipientLimits -gt 0}                        :Değer 0'dan büyük
Where-Object {$_.RecipientLimits -ge 0}                       : Değer 0'a eşit veya büyük
Where-Object {$_.RecipientLimits -lt 1}                         : Değer 1'den küçük
Where-Object {$_.RecipientLimits -le 1}                         :Değer 1'e eşit veya küçük 
Where-Object {$_.RecipientLimits -clike "*unlim*"}     :Değer "unlim" ifadesi içeriyor.
Where-Object {$_.RecipientLimits -cnotlike "*unlim*"} :Değer "unlim" ifadesi içermiyor.
Where-Object  {$_.RecipientLimits -ceq 1 -and $_.Office -clike "*TAPDK*"} 
:RecipientLimits değeri 1'e eşit VE Office değişkeni "TAPDK" ifadesini içeriyor.

Alternatif metot (-filter parametresi kullanmak):
Get-Mailbox -ResultSize unlimited -Filter {(RecipientTypeDetails -ne 'UserMailbox')}
Get-Mailbox -ResultSize unlimited -Filter {(RecipientTypeDetails -eq 'UserMailbox')}

8) Csv formatındaki dosya içerisinde listelenen kullanıcıların tamamıyla ilgili işlem yapmak

a) Örnek 1

import.csv adlı bir dosyamızın içeriğini aşağıdaki şekilde belirliyoruz:
Name
ahmet.duru
murat.tas

Daha sonra bu dosyayı foreach döngüsü içerisinde kullanıyoruz:


foreach ($person in (Import-Csv .\import.csv))
{
Set-Mailbox $person.Name -AcceptMessagesOnlyFrom {test.com.tr/Users/Administrator}

}

Böylece import.csv dosyasındaki kullanıcı hesaplarının "AcceptMessagesOnlyFrom" değişken değerini "Administrator" olarak değiştirdik. Artık bu kullanıcılar administrator dışında hiçbir yerden mail kabul etmeyecekler.

b) Örnek 2

import.csv adlı bir dosyamızın içeriğini aşağıdaki şekilde belirliyoruz:
Name,Address
abdullah.alioglu,abdullah.alioglu@tarim.gov.tr
ahmetakpinar,ahmetakpinar@tarim.gov.tr
ahmet.bulum,ahmet.bulum@tarim.gov.tr

Daha sonra bu dosyayı foreach döngüsü içerisinde kullanıyoruz:

foreach ($person in (Import-Csv .\import.csv))

{
Set-Mailbox $person.Name -ForwardingAddress $person.Address
}

Böylece dosyadaki mail adresleri için smtp yönlendirme işlemini gerçekleştiriyoruz. (Yönlendirmeyi iptal etmek için komut içerisindeki  $person.Address ifadesi yerine  $none  konur.)

9) Kullanıcı hesaplarının mailbox kota kullanımı durumlarını listelemek:

Get-Mailbox -ResultSize unlimited | Get-MailboxStatistics | Sort TotalItemSize -Descending 
| ft Displayname,TotalItemSize,StorageLimitStatus | Export-CSV "C:\All Mailboxes.csv" 
-NoTypeInformation

(Yukarıdaki komutta; Get-Mailbox -ResultSize unlimited komutuyla tüm mailbox hesaplarını listeliyoruz ve komutun çıktısını Get-MailboxStatistics komutuna girdi olarak veriyoruz. Oluşan çıktıyı ise "TotalItemSize" değişkenine göre sıralıyoruz.Son oluşan çıktıda Displayname,TotalItemSize,StorageLimitStatus değişkenlerini tablo formatında oluşturarak CSV formatında C:\All Mailboxes.csv  dosyasına gönderiyoruz.)

Çıktıyı html formatında almak istersek :
Get-Mailbox -ResultSize unlimited | Get-MailboxStatistics | Select Displayname,ItemCount,TotalItemSize,StorageLimitStatus | Sort TotalItemSize -Descending 
| ConvertTo-HTML | Out-File C:\MailboxInfo.html 


10) Kullanıcı hesaplarının 1 dakika içerisinde gönderebileceği mail adedini 1 ile kısıtlamak

Önce politikayı oluşturuyoruz:
New-ThrottlingPolicy -Name MsgRateLimitTo1Policy -MessageRateLimit 1

Get-ThrottlingPolicy MsgRateLimitTo1Policy (mevcut durum)

Tekil bir hesapta işlem yapmak için:
Set-ThrottlingPolicyAssociation -Identity murat.tas -ThrottlingPolicy MsgRateLimitTo1Policy
Get-ThrottlingPolicyAssociation -Identity murat.tas (mevcut durum)

Tüm hesaplarda işlem yapmak için:
Get-Mailbox -ResultSize unlimited | Get-ThrottlingPolicyAssociation | ft Name,ThrottlingPolicyId (mevcut durum)
Get-Mailbox -ResultSize unlimited | Set-ThrottlingPolicyAssociation -ThrottlingPolicy MsgRateLimitTo1Policy

Not: Sistemdeki default throttling policy'nin MessageRateLimit değişkenini de 1 yapmak suretiyle sistemde var olan ve bundan sonra oluşturulacak olan tüm hesaplarda da kısıtlama yapabilirdik.Fakat yukardaki örneklerde farklı hesaplar için farklı politikalar oluşturabilmekteyiz.

Sistemde mevcut olan tüm throttling politikaları listelemek için:
Get-ThrottlingPolicy | Format-List Name
Name : DefaultThrottlingPolicy_8deab173-041f-4aaf-a115-7baf141ab11f
Name : MsgRateLimitTo1Policy
Name : SymantecEWSRestoreThrottlingPolicy
Name : MsgRateLimitTo10Policy

11) Kullanıcı mailbox'larının klasör büyüklüklerini görmek

Tekil kullanıcıda görmek için:
Get-MailboxFolderStatistics murat.tas | ft identity,ItemsInFolder,FolderSize -autosize (ÖZET)
Get-MailboxFolderStatistics -Identity murat.tas -FolderScope Inbox
Get-MailboxFolderStatistics -Identity murat.tas -FolderScope DeletedItems

Tüm kullanıcılarda sadece "deleted items" klasör boyutlarını listelemek için:

Get-Mailbox -ResultSize unlimited | Get-MailboxFolderStatistics  -FolderScope DeletedItems
| Sort FolderAndSubfolderSize -Descending 
| ft Identity,FolderAndSubfolderSize,ItemsInFolder -Autosize
| Out-File -FilePath C:\deleted_items.txt
(Yukarıdaki komut çıktısında,  -autosize parametresi sayesinde kolon değerleri daha okunaklı olacaktır)

Tekil kullanıcıda "revoverable items" klasörlerini listelemek için:
Kullanıcı Deleted items (silinmiş öğeler) klasöründeki maili silerse bu mail "Recoverable Items " altındaki "Deletions" klasörüne yazılır. Bu mailler "RetainDeletedItemsFor" değişkeninde 
(get-mailbox) belirtilen  süre boyunca sistemde saklanır. Admin tarafından ilgili mail restore edilebilir.

Get-MailboxFolderStatistics -Identity murat.tas -folderscope
 RecoverableItems | ft FolderPath,ItemsInFolder,FolderSize -autosize

FolderPath                                 ItemsInFolder            FolderSize
----------                                     -------------                   ----------
/Recoverable Items                           1                          4.839 KB (4,955 bytes)
/Deletions                                         10                        59.75 KB (61,188 bytes)
/Purges                                               0                         0 B (0 bytes)

/Versions                                            0                        0 B (0 bytes)

Not: Get-MailboxStatistics komutunun çıktısında yer alan "DeletedItemCount" değişkeni yukarıdaki "Deletions" klasöründeki maillerin sayısına eşit olup, kullanıcının "Deleted items" klasöründeki mail sayısıyla bir ilgisi yoktur.

Get-MailboxStatistics murat.tas | fl DeletedItemCount
DeletedItemCount : 10

Silinmiş öğelerde kaç adet mail olduğunu görmek için:
Get-MailboxFolderStatistics -Identity murat.tas -folderscope
 DeletedItems | ft FolderPath,ItemsInFolder,FolderSize -autosize

FolderPath            ItemsInFolder             FolderSize
----------                      -------------              ----------
/Silinmis Ögeler             2                        282 B (282 bytes)

Recoverable Item'ları silmek için:
Öncelikle  powershell komutunu çalıştıracak olan kullanıcımızı (administrator) "Discovery Management" ve "Exchange Organization Administrators" gruplarına üye yapıyoruz.

Aşağıdaki komutu işletiyoruz:

New-ManagementRoleAssignment –Role "Mailbox Import Export" –user "administrator"
New-ManagementRoleAssignment –Role "Mailbox Search" –user "administrator"

Artık aşağıdaki komutu administrator kullanıcısı yetkileriyle çalıştırabiliriz:

Search-Mailbox “deneme” -SearchDumpsterOnly –DeleteContent

12) Kullanıcıların kota ayarlarını listelemek:

get-mailbox -resultsize unlimited 
| ft name,ProhibitSendQuota,ProhibitSendReceiveQuota

Name        ProhibitSendQuota    ProhibitSendReceiveQuota
----           -----------------                 -----------------                          
A                 3.3 GB                           3.4 GB                                     
B                 3.3 GB                           3.4 GB                                     

içinde "quota" geçen tüm değişkenleri listelemek daha mantıklı olabilir:

get-mailbox ahmet.mehmet | fl *quota*

ProhibitSendQuota                  : 3.4 GB (3,650,722,816 bytes)
ProhibitSendReceiveQuota     : 3.5 GB (3,758,096,384 bytes)
RecoverableItemsQuota          : 500 MB (524,288,000 bytes)
RecoverableItemsWarningQuota : 400 MB (419,430,400 bytes)
UseDatabaseQuotaDefaults      : True
IssueWarningQuota                 : 3.3 GB (3,543,348,224 bytes)
RulesQuota                              : 64 KB (65,536 bytes)
ArchiveQuota                          : unlimited
ArchiveWarningQuota             : unlimited


13) Kullanıcı mailboxları içindeki maili/mailleri silmek

Öncelikle  powershell komutunu çalıştıracak olan kullanıcımızı (administrator) "Discovery Management" ve "Exchange Organization Administrators" gruplarına üye yapıyoruz.

Aşağıdaki komutu işletiyoruz:

New-ManagementRoleAssignment –Role "Mailbox Import Export" –user "administrator"
New-ManagementRoleAssignment –Role "Mailbox Search" –user "administrator"

a) Tüm mailleri silmek:
Search-Mailbox -Identity "ahmet.mehmet" -DeleteContent -force

b) İçeriğe göre (konu veya gövdede) göre arama yapıp ilgili maili silmek

Bulunan mailleri incelemek üzere mailincele@deneme.com.tr adında kendi organizasyonumuz altında bir mail hesabı oluşturuyoruz.

Konu veya gövdede "abuzittin" ifadesini aratmak:
Get-Mailbox -ResultSize unlimited | Search-Mailbox -SearchQuery 'abuzittin' 
-TargetMailbox "mailincele@deneme.com.tr"-TargetFolder

Konu veya gövdede "abuzittin" ifadesini aratmak ve silmek:
Get-Mailbox -ResultSize unlimited | Search-Mailbox -SearchQuery 'abuzittin' 
-TargetMailbox "mailincele@deneme.com.tr"-TargetFolder Inbox -LogLevel Full -Force 
-DeleteContent | fl DisplayName,ResultItemsCount > C:\mailkimdevar.txt

Not: Komutlar "administrator" kullanıcısı ile çalıştırılmalıdır.

mailincele@deneme.com.tr hesabına girdiğimizde (Inbox klasörüne girelim),  2 adet mailde söz konusu "abuzittin" ifadesi geçtiğini görmekteyiz:



14) "Disconnected" veya "soft deleted" mailbox'ları hemen silmek

Herhangi bir mailbox objesini sildiğimizde (Remove) veya inaktif yaptığımızda (disable) disconnected mailbox pozisyonuna düşer ve "Recipient Configuration --> Disconnected Mailbox" altında listelenir. Bu mailbox, varsayılan olarak 30 gün süreyle sistemde saklanır ve daha sonra otomatik silinir. Herhangi bir nedenle bu mailbox'ları hemen silmek istediğimizde aşağıdaki işlemleri yapmalıyız:

a) Önce silinecek mailbox guid no'lar listelenir.
Get-MailboxStatistics -Database "Mailbox Database 1070557743" | Where-Object {$_.DisconnectDate -Notlike $NULL} | FL DisplayName, DisconnectDate, MailboxGuid

b)Daha sonra ise aşağıdaki komutta "mailboxGuid"  yazan yere 1. adımda öğrenmiş olduğumuz guid no yazılarak komut çalıştırılır ve silme işlemi tamamlanır:
Remove-Mailbox -Database "Mailbox Database 1070557743" -StoreMailboxIdentity MailboxGuid

Not: Database'ler arasında taşınmış olan mailbox'lar kaynak database üzerinde "soft delete" olarak silinirler. Soft delete pozisyonundaki bu mailboxları da yukarıdaki komutlar vasıtasıyla listeleyip silebiliriz.

15) İçinde belirli bir ifade bulunan tüm değişken değerlerini listelemek
Bu örneğimizde içinde "Time" ifadesi geçen tüm değişkenlerin değerlerini listeleyeceğiz:

Get-MailboxStatistics ahmet.mehmet | fl *Time*

LastLogoffTime : 11/28/2018 1:36:17 PM
LastLogonTime  : 11/28/2018 1:34:38 PM

16) Exchange sistemimizin düzgün çalışıp çalışmadığının kontrolü:
Önce aşağıdaki komutla içinde "Test" geçen komutları listeleyelim:

Get-Command -name *test*

# Test-MailFlow
# Test-OutlookWebServices
# Test-ServiceHealth
# Test-SystemHealth (Bu komut biraz uzun sürmekte)
...





Get-Queue (Bu komutun çıktısında 100'den fazla "MessageCount" görmemeliyiz.

Yukarıdaki komutları çalıştırdığımızda hata almıyorsak sistem düzgün çalışmaktadır diyebiliriz.

17) Belirli bir Dağıtım grubu (distribution group) üyelerine ait değişken değerini değiştirmek:

Get-DistributionGroupMember “bilisim” | Set-Mailbox –prohibitSendRecieveQuota 2GB

18) Kullanıcı/kullanıcılar hangi telefonlarla active-sync üzerinden bağlanmışlar

Tekil kullanıcı:
Get-ActiveSyncDeviceStatistics -Mailbox ahmet 
| ft LastSuccessSync,DeviceFriendlyName,DeviceUserAgent,DeviceOS -autosize

LastSuccessSync               DeviceFriendlyName      DeviceUserAgent               
---------------                        ------------------                ---------------                     
10/18/2017 4:38:26 PM      Siyah iPhone 4S             Apple-iPhone4C1/1307.36

Toplu kullanıcı listesi:
Get-ActiveSyncDevice | Get-ActiveSyncDeviceStatistics 
|ft FirstSyncTime,LastSuccessSync,DeviceType,DeviceFriendlyName,DeviceUserAgent,
DeviceOS,Identity -autosize | Out-String -Width 4096| Out-File -FilePath C:\ActiveSyncDeviceInfo.csv

Not: Yukarıdaki komutun çıktısı; "Identity" parametresinden dolayı display içerisine sığmadığından ve çıktı dosyası düzgün olmadığından Out-String -Width 4096 koyarak çıktının düzgün olmasını sağladık..

19) Exchange database data ve log dosyası nerede?

Get-MailboxDatabase -Status | fl EdbFilePath,LogFolderPath

EdbFilePath   : D:\xxxx\MailboxDatabase_1.edb
LogFolderPath : E:\xxx\MailboxDatabase_1\LogFolder

20)Exchange database ve log dosyalarını yerini değiştirmek

Move-DatabasePath -Identity Database-Name -EdbFilePath X:\Folder\Database\Database-Name.edb 

Move-DatabasePath -Identity Database-Name -LogFolderPath X:\Folder\Log-Folder\

21) Kullanıcı mailboxlarının Exchange Database'lerini değiştirmek

Tekil Kullanıcı mailbox taşımak:
New-MoveRequest -Identity "ahmet" -TargetDatabase “Destination-DB” 
-BatchName "ahmet"-BadItemLimit “200” -AcceptLargeDataLoss


İlgili DB'deki tüm kullanıcıları taşımak:
Get-Mailbox -Database “Source-DB” ” -ResultSize Unlimited | New-MoveRequest -TargetDatabase “Destination-DB”

22) Hangi DB'de kaçar tane mailbox var?

Get-Mailbox | Group-Object -Property:Database | Select-Object Name,Count | Sort-Object Name | Format-Table -Auto


Not: "Group-Object -Property:Database" komutu sayesinde mailbox hesaplarını Database değişken değerine göre gruplayarak listelemiş oluyoruz

23) Bir mail hesabı / dağıtım grubu adına birden fazla kişiye mail gönderebilme (send on behalf) yetkisi vermek 

Bilisim@test.com.tr adlı hesabımıza user1@test.com.tr ve user2@test.com.tr hesabı kullanıcıları için mail gönderme yetkisi vermek istediğimizi düşünelim:

bilisim@test.com.tr bir mailbox hesabı ise:
Set-Mailbox “bilisim” -GrantSendOnBehalfTo @{add=”User1“,”User2“}

bilisim@test.com.tr bir distribution group (dağıtım grubu) ise (ki mantıklı olan da budur):
Set-DistributionGroup "bilisim" -GrantSendOnBehalfTo @{add=”User1“,”User2“}

Grubun tüm üyelerine otomatik olarak gönderme yetkisi vermek için:
Set-DistributionGroup "bilisim" -GrantSendOnBehalfTo "bilisim"

Kimlerin yetkisi var görmek istersek:
Get-DistributionGroup "bilisim" | fl name,grant*

Name                            : bilisim
GrantSendOnBehalfTo : {test.com.tr/Bilisim_Grubu/bilisim}

Yetkiyi sıfırlamak için:
Set-DistributionGroup "bilisim" -GrantSendOnBehalfTo "murat.tas"

(Böylece artık sadece "murat.tas" kullanıcısının send on behalf yetkisi var. Eski ayar sıfırlandı)

Send on behalf yetkisi sayesinde, yetki verilen kişiler Outlook açtıklarında "From" kısmında "bilisim@test.com.tr" seçilebilecektir.

24) Komut çıktısını "Split" ve "Replace" komutu kullanarak düzenlemek:

Örnek-1:
Aşağıdaki komut sonucunda elde ettiğimiz listede, "PrimarySmtpAddress"  değişken değerleri içerisinde @ işaretinden önceki bölümün listesine ihtiyacımız olduğunu düşünelim. Aşağıdaki komut ile listenin tamamını alabiliyoruz: 

Get-Mailbox -OrganizationalUnit 04_Bilgi_Islem | Where-Object {$_.RecipientLimits -eq 0} 
| select PrimarySmtpAddress

PrimarySmtpAddress
------------------
test1@test.com.tr
test2@test.com.tr

Komutun sonuna split eklediğimizde ise aşağıdaki sonucu elde edebiliriz:

Get-Mailbox -OrganizationalUnit 04_Bilgi_Islem | Where-Object {$_.RecipientLimits -eq 0} 
| select PrimarySmtpAddress | %{($_.PrimarySmtpAddress -split "@")[0] }

test1
test2

Örnek 2:
Split komutunu arka arkaya iki kez kullanarak istediğimiz sonucu elde etmeye çalışacağız:


Get-Mailbox -OrganizationalUnit 04_Bilgi_Islem | Where-Object {$_.RecipientLimits -eq 0} | select DistinGuishedName

DistinguishedName
-----------------
CN=test1,OU=Users,OU=04_Bilgi_Islem,DC=tes,DC=com,DC=tr
CN=test2,OU=04_Bilgi_Islem,DC=test,DC=com,DC=tr

Get-Mailbox -OrganizationalUnit 04_Bilgi_Islem | Where-Object {$_.RecipientLimits -eq 0} | select DistinGuishedName 
| %{($_.DistinguishedName -split "=")[1] } | %{($_ -split ",")[0] }

test1
test2

Alternatif yazılış:  %{($_.DistinguishedName.split("="))[1].Split(",")[0] }


"test" ifadesini silmek istersek "replace" komutunu kullanmalıyız:

Get-Mailbox -OrganizationalUnit 04_Bilgi_Islem | Where-Object {$_.RecipientLimits -eq 0} | select DistinguishedName,PrimarySmtpAddress 
| %{($_.DistinguishedName.split(","))[0].Split("=")[1].Replace("test","") }

1
2

Örnek 3:
Örnek 2'de, tek değişkene (DistinguishedName) göre split işlemini gerçekleştirdik. İki farklı değişken değerini split ile düzenleyerek sonucu çıktı şeklinde almak isteseydik:

Komut çıktılarını düzenleyerek değişkenlere array oluşturarak atıyoruz:

$a = Get-Mailbox -OrganizationalUnit 04_Bilgi_Islem 
| Where-Object {$_.RecipientLimits -eq 0} | select PrimarySmtpAddress 
| %{($_.PrimarySmtpAddress -split "@")[0] }

$b = Get-Mailbox -OrganizationalUnit 04_Bilgi_Islem 
| Where-Object {$_.RecipientLimits -eq 0} | select Guid 
| %{($_.Guid -split "-")[0] }

Daha sonra her değişkenin satır satır çıktısını almak için "for" döngüsü kullanarak array değerlerini ekrana yazdırıyoruz:

for($i =0; $i -lt $a.Length ; $i++) {   write-host $a[$i] "," $b[$i]  }
test1 , c0117729
test2 , 374147b2

Böylece; mesela  PrimarySmtpAddress değişken değerinin ("test1@test.com.tr") "test" bölümünü,  Guid değişken değerinin ("c0117729-0e69-417e-89e5-3329c68bf343") ise ilk tire (-) işaretinden önceki bölümü olan "c0117729" bölümünü toplamış oluyoruz.

25) Sunucu üzerinde Mailbox içeriğini pst dosyaya export etmek:


a) Öncelikle Management Shell uygulamasını çalıştıracak olan kullanıcıya uygun yetkiler verilir.Bu işlemin bir kez gerçekleştirilmesi yeterlidir:

New-ManagementRoleAssignment –Role "Mailbox Import Export" –User Administrator

b) Sunucuda uygun genişliğe sahip bir disk üzerinde "PST" adlı bir klasör açılır ve klasöre "Exchange Trusted Subsystem" grubu için okuma,yazma hakki verilir. Bu klasör ayrıca network üzerinden paylaşıma açılır.

























c) Aşağıdaki komut çalıştırılır:

New-MailboxExportRequest -Mailbox ad.soyad 
-FilePath "\\Sunucu_IP_Adresi\pst\AdSoyad.pst"

d) Mailbox export durumu aşağıdaki komutla kontrol edilir. İşlem tamamlandığında status "Completed" konuma geçecektir.

Get-MailboxExportRequest

e) "Completed" yani tamamlanan görevleri hafızadan silmek için aşağıdaki komut çalıştırılır:

Get-MailboxExportRequest | where {$_.status -eq "Completed"} 
| Remove-MailboxExportRequest


Umarım faydalı olmuştur

Murat TAŞ

Active Directory - Fortigate - Fortigate CA sertifikasının bilgisayarlara AD grup politikası ile dağıtılması

Merhaba,

Fortigate firewall üzerinde "ssl deep inspection" özelliğini firewall kuralı içerisinde kullanabilmek ve böylece bilgisayar/sunucuların ssl internet trafiklerini analiz edebilmek için Fortigate'in CA sertifikasını domain ortamındaki tüm bilgisayar ve sunuculara active directory grup politikası ile dağıtılması gerekir. 

Aşağıdaki adımları sırayla takip edelim:

1) Fortigate firewall üzerinde aşağıdaki konumda yer alan CA sertifikasını indirelim:















Bu sertifikayı "SSL/SSH Inspection" profil ayarlarımız içinden de indirebiliriz:
















2) Bu sertifikayı AD sunucumuza kopyalayarak politika oluşturmaya başlayabiliriz. İlk önce ilgili OU üzerindeki "Create a GPO..." sekmesine tıklıyoruz:





3) Politika ayarlarına girerek, Computer Configuration --> Policies --> Windows Settings --> Security Settings --> Public Key Policies --> Trusted root certification authorities üzerine gelip "Import" seçiyoruz:


















Sunucumuza kopyaladığımız sertifika dosyasını seçip aşağıdaki adımları sırayla tamamlıyoruz:































4) Son adım olarak, AD sunucumuzda aşağıdaki komutu çalıştırıyoruz ve politikanın hemen devreye girmesini sağlıyoruz:












5) KONTROL:


Politikanın uygulandığı bir bilgisayarda mmc konsolu üzerinden sertifikanın yüklendiğini görebiliriz 

















Internet Explorer ve Google Chrome'un tüm sürümleri varsayılan olarak bu sertifika havuzundaki sertifikayı görerek https olan tüm sitelerde sertifika sorunu yaşanmaksızın bağlanacaktır (https://www.google.com.tr adresine girdiğimizde sertifika hatası vermeyecektir).

Mozilla Firefox'un 51 ve sonrası sürümlerinin bilgisayardaki windows sertifika havuzunu kullanabilmesi için aşağıdaki makalede yer alan işlemler yapılmalıdır:

Active Directory - Grup politikası ile "Mozilla Firefox'un Bilgisayarın Sertifika Deposunu kullanmasını sağlamak"

Daha eski Mozilla Firefox sürümlerinde ise sertifikanın elle tek tek yüklenmesi gerekecektir.

https://www.google.com.tr adresine girip sertifika ayarlarını incelediğimizde ssl deep inspection kuralımızın başarılı olduğunu göreceğiz:

























Umarım faydalı olmuştur.

Murat TAŞ

Active Directory - PC kapanmasını engellemek için group policy oluşturulması

Merhaba,

Belirli bir grup bilgisayarda bazı görevleri mesai saati dışında çalıştırabilmek için bilgisayarların kapanmasını engellemek isteyebiliriz. 

Bu makalede, Active Directory üzerinde grup politikası oluşturarak bu engellemeyi nasıl yapabileceğimizi göreceğiz:

1) AD sunucumuz üzerinde "Group Policy Management" uygulamasını açıyoruz ev ilgili "Organisation Unit (OU)" üzerinde iken "Create a GPO ... " tıklıyoruz:



2) Politika ayarlarımızı aşağıdaki şekilde gerçekleştiriyoruz:

a) Computer configuration --> Preferences --> Windows settings -->  Registery sekmesinde "Action:Update" seçiyor ve aşağıdaki ayarı yapıyoruz:

Action: Update
Hive: HKEY_LOCAL_MACHINE
Key Path: SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
Value name: shutdownwithoutlogon
Value type: REG_DWORD
Value Data: 0


















Bu sayede login ekranında bilgisayar kapatılamayacak.

3) Diğer ayarımız ise aşağıdaki şekilde:

User configuration --> Policies --> Administrative Templates --> "Start menu and ..." sekmesi altındaki "Remove and Prevent access to the Shut Down..." ayarı "Enabled" konuma getirilecek:


















Bu sayede, gui ve komut satırı üzerinde "shutdown" , "Restart", "sleep" veya "hybernate" işlemi gerçekleştirilemeyecektir.

4) En son adım olarak AD sunucu üzerinde aşağıdaki komut çalıştırılarak politikanın hemen devreye girmesi sağlanır:







Umarım faydalı olmuştur

Murat TAŞ

Active Directory - Bilgisayar ve sunucu yönetim hesaplarının group policy ile belirlenmesi

Merhaba,

Domain ortamına dahil olan tüm sunucu ve bilgisayarlar varsayılan olarak domain admins grubuna üye olan hesaplarla yönetilebilirler. Fakat sunucu ve bilgisayarları domain admin hesabıyla yönetmek büyük bir güvenlik açığına neden olacağından sadece bu sunucu ve bilgisayarları yönetmeye yetkili  olan ve domainde başka yetkisi olmayan hesapların tanımlanması uygun olacaktır.

Bu makaledeki işlemler yapıldıktan sonra diğer adım olarak sadece bu yönetim hesaplarıyla ilgili bilgisayar ve sunuculara giriş (login) izni verilmelidir. Söz konusu işlemler ise aşağıdaki makalede anlatılmaktadır:


1) Öncelikle "Active Directory users and computers" uygulaması kullanılarak, "destekgrup" adında bir grup oluşturup üyelerini belirliyoruz (grup ve üye adlarında admin, yonetici vs gibi ibareler geçmemeli)

























2) İlgili bilgisayar organizasyonu (OU) altında politikamızı oluşturarak "Restricted Groups" sekmesi altında destekgrup adlı grubu Administrators grubuna ekliyoruz:

Böylece ilgili OU altındaki bilgisayarların lokal "administrators" grubu üyeleri "destekgrup" ve "domain admins" gruplarından (dolayısıyla onların üyelerinden) oluşacak.

3) Aşağıdaki komutla politikanın hemen aktif olmasını sağlayabiliriz:


Not: Buna benzer bir çalışmanın sunucular için de yapılması (farklı grup ve üyeler ile) uygun olacaktır. Mesela bilgisayarları yönetirken dpc1, dpc2... hesapları ile yönetim yapılabilirken sunucu yönetimi için ds1, ds2... vs. adlı hesaplar kullanılabilir. Bu hesapların şifreleri de birbirinden farklı olmalı ve belirli aralıklarla değiştirilmelidir.

Umarım faydalı olmuştur.

Murat TAŞ

Active Directory - Domain ve Enterprise Admin Hesapların Güvenliğinin Sağlanması

Merhaba,

Bu makalemizde bilgisayar ve sunucularda; enterprise admins, domain admins grubuna üye olan yetkili hesaplarla lokal veya remote giriş (login) yapılmasını, servis çalıştırılmasını vb. engelleyerek bu yetkiye sahip hesapları nasıl koruyabileceğimizi göreceğiz.

Dikkat: Bu politikayı uygulamadan önce, bilgisayar ve sunucuları yönetmek üzere, yönetim hesaplarını aşağıdaki makalede anlatıldığı şekilde oluşturmalıyız:


1) Group Policy Management uygulamasını çalıştırıyoruz ve ilgili "organisation unit(OU)" üzerinde sağ tuş yaparak "Create a GPO in this domain and link it here" a tıklıyoruz:



































2) Daha sonra ilgili politikayı "edit" ediyoruz:




















3) Politikada aşağıdaki konumda bulunan değerlere giriş yaparak hepsinde "Enterprise admins" ve "Domain admins" gruplarını seçiyoruz:

Deny logon as a batch job
Deny logon as a service
Deny logon localy
Deny logon through terminal services












Son durum aşağıdaki şekilde olacak:


Bu politikayı, tüm client bilgisayarlara ve sunucuların bulunduğu organizasyon unit (OU) altına koyuyoruz (AD domain controller sunucular hariç)

4) Active Directory sunucumuz üzerinde politikanın hemen geçerli olması için aşağıdaki komutu çalıştırıyoruz:







5) TEST:  İlgili organisation unit altındaki bilgisayarda çalıştır menüsünde "rsop.msc" ile (resultant set of policy) kontrol edilerek politikanın düzgün basılıp basılmadığı anlaşılacaktır. Ayrıca herhangi bir bilgisayardan mevcut bir domain admin hesabı ile login işlemi denendiğinde, oluşturmuş olduğumuz bu politika gereği giriş yapamıyor olmamız gerekir.

Böylece, Domaindeki bir bilgisayara veya exchange sunucumuza bağlanmak ve yönetmek için (program kurmak vs) domain admin yetkili bir hesaba ihtiyacımız olmayacaktır.

Umarım faydalı olmuştur.

Murat TAŞ

MS IIS - SSL Yönlendirme (Sitenin https olarak açılmasını sağlamak)

Bu makalede, www.a.com sitesini https://www.a.com olarak IIS tarafında yönlendirmeyi ve bu sayede sitenin her durumda https olarak açılmasını nasıl sağlayacağımızı göreceğiz 

1)İlk önce sunucuya SSL sertifikası yüklenir

2)Sitenin "bindings" ayarlarına "https" bölümü eklenir.

3)Sitenin "SSL settings" bölümünde "require ssl" seçimi varsa kaldırılmalıdır.

4)URL Rewrite Module kurulur (IIS versiyonuna uygun olan)

5) ilgili sitenin klasörü altındaki web.config dosyası, notepadd ++ editörüyle açılır aşağıdaki kırmızı bölüm eklenir:

<configuration>

<system.webServer>

<rewrite>

<rules>

<rule name="https redirect">

<match url="(.*)" ignoreCase="false" />

<conditions>

<add input="{HTTPS}" pattern="off" ignoreCase="false" />

</conditions>

<action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}{REQUEST_URI}" />

</rule>

</rules>

</rewrite>

</system.webServer>

</configuration>

MS Exchange - Domaine dahil olmuş bir bilgisayardan anonim mail gönderimini engellemek

Domaine dahil olmuş bilgisayarımıza bulaşmış bir zararlı yazılımı tıkladığımızda kendi yetkilerimizi kullanarak ilgili yazılım mail gönderimi yapabilir. Veya meraklı kullanıcılar birbirleri arasında  telnet üzerinden mail gönderimi yapabilir. Bunu engellemek için ya domain bilgisayarlarımızla exchange arasında ilgili smtp erişim portlarına (connector) erişimi kapatacağız ya da ilgili smtp connectorlerin üzerinden anonymous  gönderimi engelleyeceğiz:

Örn:

İlgili SMTP connector(ler) açılır:



Normalde Konsol üzerinden Anonymous kaldırdığımızda dış domainlerden de mail alamayız. O yüzden ayarı buradan yapmıyoruz :


Exchange power shell açılır ve aşağıdaki komut girilir.

Önce ilgili receive connector öğrenilir:

>Get-ReceiveConnector

Identity                                Bindings                                Enabled
--------                                --------                                -------
DOMAIN\Receive-Port 25              {:::25, 0.0.0.0:25}                     True
DOMAIN\Client-Port 587              {:::587, 0.0.0.0:587}                   True
DOMAIN\Relay_Port_50_use_carefully  {0.0.0.0:50}                            False

Aşağıdaki komut çalıştırılır:

>Get-ReceiveConnector "DOMAIN\Receive_Port_25" | Get-ADPermission -user "NT AUTHORITY\Anonymous Logon" | where {$_.ExtendedRights -like "ms-exch-smtp-accept-authoritative-domain-sender"} | Remove-ADPermission

Confirm
Are you sure you want to perform this action?
Removing Active Directory permission "TAPDKPOSTA\Receive_Port_25" for user "NT AUTHORITY\ANONYMOUS LOGON" with access rights "'ExtendedRight'".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [?] Help (default is "Y"): Y

Artık domaine login olmuş bir bilgisayardan telnet ile mail atılamıyor ama dış domainlerden ilgili connector mail kabul etmektedir:

220 mail.tapdk.gov.tr
EHLO mail.tapdk.gov.tr
250-mail.tapdk.gov.tr Hello [x.x.x.x]
250-SIZE
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-AUTH NTLM LOGIN
250-8BITMIME
250-BINARYMIME
250 CHUNKING
MAIL FROM:<a@tapdk.gov.tr>
250 2.1.0 Sender OK
RCPT TO:<b@tapdk.gov.tr>
250 2.1.5 Recipient OK
DATA
354 Start mail input; end with <CRLF>.<CRLF>
subject: test
test yapalim bakalim
.
550 5.7.1 Client does not have permissions to send as this sender

MS WSUS - Güncellemeleri toplu olarak onaylama (approve) powershell scripti

Bu makalemizde, Wsus güncellemelerini powershell script ile nasıl toplu olarak onaylayabileceğimizi (approve) göreceğiz:

1) Tüm security ve critical update'leri tüm bilgisayarlar için approve etmek için: 

all_sec_and_crt_approve.ps1:

Write-Progress -Activity 'Tum security updates ler bulunuyor..' -PercentComplete 0
$updatesneeded = Get-WsusUpdate -Classification Security -Approval AnyExceptDeclined -Status any
$i = 0
$total = $updatesneeded.Count
foreach ($update in $updatesneeded)
{
  Write-Progress -Activity 'Tum security updates ler onaylaniyor.. ' -Status "$($update.Update.Title)" -PercentComplete (($i/$total) * 100)
  Approve-WsusUpdate -Update $update -Action Install -TargetGroupName 'all computers'
  $i++
}
Write-Host "Toplam onaylanan security update: $total" -ForegroundColor Yellow


Write-Progress -Activity 'Tum critical updates ler bulunuyor..' -PercentComplete 0
$updatesneeded2 = Get-WsusUpdate -Classification Critical -Approval AnyExceptDeclined -Status any
$i = 0
$total = $updatesneeded2.Count
foreach ($update in $updatesneeded2)
{
  Write-Progress -Activity 'Tum critical updates ler onaylaniyor.....' -Status "$($update.Update.Title)" -PercentComplete (($i/$total) * 100)
  Approve-WsusUpdate -Update $update -Action Install -TargetGroupName 'all computers'
  $i++
}
Write-Host "Toplam onaylanan critical update: $total" -ForegroundColor Yellow

2) Unapproved durumdaki security ve critical update'leri tüm bilgisayarlar için approve etmek için 

unapproved_sec_and_crt_approve.ps1:

Write-Progress -Activity 'Onaylanmamis security update ler bulunuyor...' -PercentComplete 0
$updatesneeded = Get-WsusUpdate -Classification Security -Approval Unapproved -Status any
$i = 0
$total = $updatesneeded.Count
foreach ($update in $updatesneeded)
{
  Write-Progress -Activity 'Onaylanmamis security update ler onaylaniyor...' -Status "$($update.Update.Title)" -PercentComplete (($i/$total) * 100)
  Approve-WsusUpdate -Update $update -Action Install -TargetGroupName 'all computers'
  $i++
}
Write-Host "Toplam onaylanan security update: $total" -ForegroundColor Yellow

Write-Progress -Activity 'Onaylanmamis critical update ler bulunuyor...' -PercentComplete 0
$updatesneeded2 = Get-WsusUpdate -Classification Critical -Approval Unapproved -Status any
$i = 0
$total = $updatesneeded2.Count
foreach ($update in $updatesneeded2)
{
  Write-Progress -Activity 'Onaylanmamis critical update ler onaylaniyor...' -Status "$($update.Update.Title)" -PercentComplete (($i/$total) * 100)
  Approve-WsusUpdate -Update $update -Action Install -TargetGroupName 'all computers'
  $i++
}
Write-Host "Toplam onaylanan critical update: $total" -ForegroundColor Yellow  

3) Tüm update'leri approve etmek için:

approve_all_updates_for_a_group.ps1:

Write-Progress -Activity 'Tum updateler bulunuyor...' -PercentComplete 0
$updatesneeded = Get-WsusUpdate -Classification All -Approval AnyExceptDeclined -Status any
$i = 0
$total = $updatesneeded.Count
foreach ($update in $updatesneeded)
{
  Write-Progress -Activity 'Tum update ler onaylaniyor...' -Status "$($update.Update.Title)" -PercentComplete (($i/$total) * 100)
  Approve-WsusUpdate -Update $update -Action Install -TargetGroupName 'Kat-7' (kat-7 grubundaki bilgisayarlar için approve ediyoruz.)
  $i++
}
Write-Host "Onaylanan update: $total" -ForegroundColor Yellow

MS Exchange - Exchange dışındaki bir sunucuda request ile üretilmiş bir wildcard sertifikanın exchange sunucuya yüklenmesi

Bu senaryomuzda, Exchange dışındaki bir sunucuda bulunan IIS üzerinde sertifika request dosyası ve private key dosyası oluşturuldu. Daha sonra bu dosyalar sertifika otoritesine gönderilerek wildcard sertifika üretildi.

Üretilen bu wildcard sertifika exchange sunucuya import edilmek istendiğinde import edilmekte fakat emc konsol üzerinde gözükmemekte idi. Exchange shell üzerinden import edilmeye çalışıldığında ise aşağıdaki hataları almaktaydık:

>Import-ExchangeCertificate -FileData ([Byte[]]$(Get-Content -Path  G:\SCRIPTLER_SSL\STAR_tapdk_gov_tr.crt -Encoding byte -ReadCount 0))

Thumbprint                                Services   Subject

----------                                --------   -------

F73EC0DF890D1F7CF61A4BCB3B313ADC623EFE09  ......     CN=*.tapdk.gov.tr, OU=TrustSafe WildCard, OU=Provided by ISIMTE...

Yukarıdaki komut başarılı şekilde tamamlanıyor fakat aşağıdaki komutu çalıştırdığımızda private key missing hatası veriyordu:


>Enable-ExchangeCertificate -Thumbprint F73EC0DF890D1F7CF61A4BCB3B313ADC623EFE09 -Services "POP,IMAP,SMTP,IIS"

The certificate with thumbprint F73EC0DF890D1F7CF61A4BCB3B313ADC623EFE09 was found but is not valid for use with Exchange Server (reason: PrivateKeyMissing).

    + CategoryInfo          : NotSpecified: (:) [Enable-ExchangeCertificate], InvalidOperationException

    + FullyQualifiedErrorId : 670ED46B,Microsoft.Exchange.Management.SystemConfigurationTasks.EnableExchangeCertificate


BU SORUNUN ÇÖZÜMÜ:

Sertifika request oluşturduğumuz IIS sunucu üzerinde :

Başlat --> çalıştır --> mmc --> add remove snapin --> certificates --> computer account --> local computer --> finish dedikten sonra,

personal --> certificates altındaki ilgili wildcard sertifikasına sağ tuş yapıp "all task--> export" yapıp "yes export the private key" seçilerek .pfx dosyasını elde ediyoruz.

Daha sonra bu pfx dosyasını exchange sunucuya (ve diğer IIS sunuculara) import edebiliriz.

Exchange POP ve IMAP servislerinde yüklenemedi fakat SMTP ve IIS servislerine başarılı şekilde yüklendi:



MS SQL - Database Dosya Konum Değiştirme

MS SQL sunucuda database dosyalarının bulunduğu konum herhangi bir nedenle değiştirilmek istenebilir (Disk değişikliği,klasör değişikliği, sunucu değişikliği vs.)


Bu makalede, herhangi bir database'e ait dosyaların (mdf,ldf) konumunu nasıl değiştirebileceğimizi göreceğiz.


1. Method ( take offline -- alter database -- move files -- take online)


*Database'i offline yapıyoruz:

ALTER DATABASE test1 SET OFFLINE WITH ROLLBACK IMMEDIATE;


*Path değiştiriyoruz:

USE master;

ALTER DATABASE test1

MODIFY FILE (name='test1'

  ,filename='C:\test_db_files\test1.mdf'); --Data dosyasının yeni konumu


ALTER DATABASE test1

MODIFY FILE (name='test1_log'

  ,filename='C:\test_db_files\test1_log.ldf'); --Log dosyasınınyeni konumu


*mdf ve ldf dosyalarını yeni yerine taşıyoruz.


*Taşıma bittikten sonra database'i online yapıyoruz:

ALTER DATABASE test1 SET ONLINE;



Test:

SELECT filename

FROM sys.sysaltfiles

WHERE name LIKE 'Test1%';


veya

SELECT name, physical_name AS CurrentLocation, state_desc

FROM sys.master_files

WHERE database_id = DB_ID(N'test1');


2.Method (attach-- detach):

  • İlgili Database sağ tuş tıklanır
  • "Properties" sekmesi açılır 
  • "Files" sekmesine geçilir
  • Path ve FileName bölümleri not edilir
  • İlgili Database sağ tuş tıklanır
  •  Tasks -> Detach seçilir.
  • Dosyalar hedef klasöre konur.
  • Sunucunun Databases bölümüne gelinip "Attach" yapılır
  • Add butonuna tıklanır
  • Yeni lokasyondaki dosyalar seçilir
  •  OK tıklanır.


KAYNAKLAR:


https://msdn.microsoft.com/en-us/library/ms345483.aspx

http://dba.stackexchange.com/questions/52007/how-do-i-move-sql-server-database-files