{"id":271,"title":"PowerShell kullanarak Active Directory gruplar\u0131na CSV dosyas\u0131ndan kullan\u0131c\u0131 import i\u015flemi","content":"<p>Tabii \ud83d\udc4d Senin verdi\u011fin scripti ve a&ccedil;\u0131klamalar\u0131 derli toplu bir <strong>blog yaz\u0131s\u0131<\/strong> haline getirdim. Hem giri\u015f hem de ad\u0131m ad\u0131m anlat\u0131m olacak \u015fekilde d&uuml;zenledim:<\/p>\r\n<hr>\r\n<h1>PowerShell ile CSV Dosyas\u0131ndan Active Directory Gruplar\u0131na Kullan\u0131c\u0131 Ekleme<\/h1>\r\n<p>Active Directory ortam\u0131nda &ccedil;ok say\u0131da kullan\u0131c\u0131y\u0131 farkl\u0131 gruplara eklemek manuel olarak olduk&ccedil;a zaman al\u0131c\u0131 olabilir. &Ouml;zellikle y&uuml;zlerce kullan\u0131c\u0131y\u0131 birden gruplara dahil etmeniz gerekti\u011finde, <strong>PowerShell<\/strong> kullanarak bu i\u015flemi otomatikle\u015ftirmek hem zaman kazand\u0131r\u0131r hem de hata pay\u0131n\u0131 en aza indirir.<\/p>\r\n<p>Bu yaz\u0131da, <strong>CSV dosyas\u0131ndan kullan\u0131c\u0131lar\u0131 Active Directory gruplar\u0131na ekleyen<\/strong> bir PowerShell scriptini inceleyece\u011fiz.<\/p>\r\n<hr>\r\n<h2>1. CSV Dosyas\u0131n\u0131n Haz\u0131rlanmas\u0131<\/h2>\r\n<p>\u0130lk olarak bir CSV dosyas\u0131 olu\u015fturman\u0131z gerekiyor. Dosya iki s&uuml;tundan olu\u015fmal\u0131:<\/p>\r\n<ul>\r\n<li>\r\n<p><strong>SamAccountName<\/strong> &rarr; AD kullan\u0131c\u0131 ad\u0131<\/p>\r\n<\/li>\r\n<li>\r\n<p><strong>GroupName<\/strong> &rarr; Eklenecek grup ad\u0131<\/p>\r\n<\/li>\r\n<\/ul>\r\n<p>&Ouml;rnek CSV i&ccedil;eri\u011fi \u015fu \u015fekilde olabilir:<\/p>\r\n<pre><code class=\"language-csv\">SamAccountName,GroupName\r\njohn.doe,IT_Department\r\njane.smith,HR_Department\r\nmike.wilson,Finance_Group\r\nsarah.jones,Marketing_Team\r\nrobert.brown,Sales_Department\r\n<\/code><\/pre>\r\n<p>\ud83d\udccc CSV dosyan\u0131z\u0131 &ouml;rne\u011fin <code>C:\\bulk_group\\test_bulk.csv<\/code> yoluna kaydedebilirsiniz.<\/p>\r\n<hr>\r\n<h2>2. PowerShell Scripti<\/h2>\r\n<p>A\u015fa\u011f\u0131daki script CSV dosyas\u0131n\u0131 okur, her kullan\u0131c\u0131y\u0131 ilgili gruba eklemeye &ccedil;al\u0131\u015f\u0131r ve i\u015flemlerin sonucunu renkli mesajlarla raporlar:<\/p>\r\n<pre><code class=\"language-powershell\"># ============================\r\n# AD Kullan\u0131c\u0131lar\u0131n\u0131 Gruplara CSV'den Import Etme Scripti\r\n# ============================\r\n\r\n# CSV dosya yolu\r\n$CSVPath = \"C:\\bulk_group\\test_bulk.csv\"\r\n\r\n# CSV'yi import et\r\n$Users = Import-Csv -Path $CSVPath\r\n\r\nforeach ($User in $Users) {\r\n    # Bo\u015f de\u011fer kontrol&uuml;\r\n    if ([string]::IsNullOrEmpty($User.SamAccountName) -or [string]::IsNullOrEmpty($User.GroupName)) {\r\n        Write-Host \"Hata: Bo\u015f kullan\u0131c\u0131 ad\u0131 veya grup ad\u0131 tespit edildi.\" -ForegroundColor Red\r\n        continue\r\n    }\r\n\r\n    try {\r\n        # Kullan\u0131c\u0131 var m\u0131?\r\n        $ADUser = Get-ADUser -Identity $User.SamAccountName -ErrorAction Stop\r\n\r\n        # Grup var m\u0131?\r\n        $ADGroup = Get-ADGroup -Identity $User.GroupName -ErrorAction Stop\r\n\r\n        # Kullan\u0131c\u0131 grupta m\u0131?\r\n        $IsMember = Get-ADGroupMember -Identity $ADGroup | Where-Object { $_.SamAccountName -eq $User.SamAccountName }\r\n\r\n        if (-not $IsMember) {\r\n            # Kullan\u0131c\u0131y\u0131 gruba ekle\r\n            Add-ADGroupMember -Identity $ADGroup -Members $ADUser -ErrorAction Stop\r\n            Write-Host \"Ba\u015far\u0131l\u0131: $($User.SamAccountName) kullan\u0131c\u0131s\u0131 $($User.GroupName) grubuna eklendi.\" -ForegroundColor Green\r\n        }\r\n        else {\r\n            Write-Host \"Bilgi: $($User.SamAccountName) kullan\u0131c\u0131s\u0131 zaten $($User.GroupName) grubunda mevcut.\" -ForegroundColor Yellow\r\n        }\r\n    }\r\n    catch {\r\n        Write-Host \"Hata: $($User.SamAccountName) i&ccedil;in i\u015flem ba\u015far\u0131s\u0131z -&gt; $($_.Exception.Message)\" -ForegroundColor Red\r\n    }\r\n}\r\n<\/code><\/pre>\r\n<hr>\r\n<h2>3. Scriptin &Ouml;zellikleri<\/h2>\r\n<p>\u2705 <strong>Hata kontrol&uuml; yapar<\/strong> &rarr; Bo\u015f kullan\u0131c\u0131\/grup sat\u0131rlar\u0131n\u0131 atlar<br>\u2705 <strong>Kullan\u0131c\u0131y\u0131 do\u011frular<\/strong> &rarr; AD&rsquo;de ger&ccedil;ekten var m\u0131 kontrol eder<br>\u2705 <strong>Grubu do\u011frular<\/strong> &rarr; Belirtilen grup mevcut mu bakar<br>\u2705 <strong>&Uuml;yelik kontrol&uuml; yapar<\/strong> &rarr; Kullan\u0131c\u0131 zaten grupta m\u0131 kontrol eder<br>\u2705 <strong>Renkli raporlama<\/strong> &rarr;<\/p>\r\n<ul>\r\n<li>\r\n<p>Ye\u015fil &rarr; Ba\u015far\u0131l\u0131 ekleme<\/p>\r\n<\/li>\r\n<li>\r\n<p>Sar\u0131 &rarr; Zaten grupta<\/p>\r\n<\/li>\r\n<li>\r\n<p>K\u0131rm\u0131z\u0131 &rarr; Hata<\/p>\r\n<\/li>\r\n<\/ul>\r\n<hr>\r\n<h2>4. Scripti &Ccedil;al\u0131\u015ft\u0131rmadan &Ouml;nce<\/h2>\r\n<ul>\r\n<li>\r\n<p>PowerShell&rsquo;i <strong>y&ouml;netici olarak &ccedil;al\u0131\u015ft\u0131r\u0131n<\/strong><\/p>\r\n<\/li>\r\n<li>\r\n<p><code>Import-Module ActiveDirectory<\/code> komutu ile <strong>AD mod&uuml;l&uuml;n&uuml; y&uuml;kleyin<\/strong><\/p>\r\n<\/li>\r\n<li>\r\n<p>CSV dosyan\u0131z\u0131n <strong>do\u011fru formatta<\/strong> oldu\u011fundan emin olun<\/p>\r\n<\/li>\r\n<\/ul>\r\n<p>Harika \ud83d\udc4d O zaman blog yaz\u0131s\u0131na ek bir b&ouml;l&uuml;m olarak <strong>loglama<\/strong> k\u0131sm\u0131n\u0131 da dahil edelim. B&ouml;ylece i\u015flemleri yaln\u0131zca ekranda de\u011fil, dosyalarda da saklayabileceksin.<\/p>\r\n<p>A\u015fa\u011f\u0131da g&uuml;ncellenmi\u015f script var \ud83d\udc47<\/p>\r\n<hr>\r\n<h2>5. \u0130\u015flemleri Log Dosyalar\u0131na Kaydetme<\/h2>\r\n<p>Raporlar\u0131 yaln\u0131zca ekranda g&ouml;rmek yeterli olmayabilir. Ba\u015far\u0131l\u0131 ve ba\u015far\u0131s\u0131z i\u015flemleri daha sonra incelemek i&ccedil;in ayr\u0131 log dosyalar\u0131na yazd\u0131rmak &ccedil;ok faydal\u0131d\u0131r.<\/p>\r\n<p>A\u015fa\u011f\u0131daki script, <code>C:\\bulk_group\\logs\\<\/code> klas&ouml;r&uuml;ne iki dosya olu\u015fturur:<\/p>\r\n<ul>\r\n<li>\r\n<p><strong>success.log<\/strong> &rarr; ba\u015far\u0131l\u0131 eklemeler<\/p>\r\n<\/li>\r\n<li>\r\n<p><strong>error.log<\/strong> &rarr; hatalar<\/p>\r\n<\/li>\r\n<\/ul>\r\n<pre><code class=\"language-powershell\"># ============================\r\n# AD Kullan\u0131c\u0131lar\u0131n\u0131 Gruplara CSV'den Import Etme + Loglama\r\n# ============================\r\n\r\n# CSV dosya yolu\r\n$CSVPath = \"C:\\bulk_group\\test_bulk.csv\"\r\n\r\n# Log dosya yollar\u0131\r\n$LogPath = \"C:\\bulk_group\\logs\"\r\n$SuccessLog = Join-Path $LogPath \"success.log\"\r\n$ErrorLog   = Join-Path $LogPath \"error.log\"\r\n\r\n# Log klas&ouml;r&uuml; yoksa olu\u015ftur\r\nif (-not (Test-Path $LogPath)) {\r\n    New-Item -ItemType Directory -Path $LogPath | Out-Null\r\n}\r\n\r\n# CSV'yi import et\r\n$Users = Import-Csv -Path $CSVPath\r\n\r\nforeach ($User in $Users) {\r\n    if ([string]::IsNullOrEmpty($User.SamAccountName) -or [string]::IsNullOrEmpty($User.GroupName)) {\r\n        $msg = \"Hata: Bo\u015f kullan\u0131c\u0131 ad\u0131 veya grup ad\u0131 tespit edildi.\"\r\n        Write-Host $msg -ForegroundColor Red\r\n        Add-Content -Path $ErrorLog -Value \"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | $msg\"\r\n        continue\r\n    }\r\n\r\n    try {\r\n        # Kullan\u0131c\u0131 ve grup kontrol&uuml;\r\n        $ADUser = Get-ADUser -Identity $User.SamAccountName -ErrorAction Stop\r\n        $ADGroup = Get-ADGroup -Identity $User.GroupName -ErrorAction Stop\r\n\r\n        # Kullan\u0131c\u0131 grupta m\u0131?\r\n        $IsMember = Get-ADGroupMember -Identity $ADGroup | Where-Object { $_.SamAccountName -eq $User.SamAccountName }\r\n\r\n        if (-not $IsMember) {\r\n            Add-ADGroupMember -Identity $ADGroup -Members $ADUser -ErrorAction Stop\r\n            $msg = \"Ba\u015far\u0131l\u0131: $($User.SamAccountName) kullan\u0131c\u0131s\u0131 $($User.GroupName) grubuna eklendi.\"\r\n            Write-Host $msg -ForegroundColor Green\r\n            Add-Content -Path $SuccessLog -Value \"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | $msg\"\r\n        }\r\n        else {\r\n            $msg = \"Bilgi: $($User.SamAccountName) kullan\u0131c\u0131s\u0131 zaten $($User.GroupName) grubunda mevcut.\"\r\n            Write-Host $msg -ForegroundColor Yellow\r\n            # \u0130ste\u011fe ba\u011fl\u0131: bilgi mesajlar\u0131n\u0131 loglamak i&ccedil;in a\u015fa\u011f\u0131daki sat\u0131r\u0131 a&ccedil;abilirsiniz\r\n            # Add-Content -Path $SuccessLog -Value \"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | $msg\"\r\n        }\r\n    }\r\n    catch {\r\n        $msg = \"Hata: $($User.SamAccountName) i&ccedil;in i\u015flem ba\u015far\u0131s\u0131z -&gt; $($_.Exception.Message)\"\r\n        Write-Host $msg -ForegroundColor Red\r\n        Add-Content -Path $ErrorLog -Value \"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | $msg\"\r\n    }\r\n}\r\n<\/code><\/pre>\r\n<hr>\r\n<h3>Log Dosyalar\u0131n\u0131n &Ouml;rnek &Ccedil;\u0131kt\u0131s\u0131<\/h3>\r\n<p>\ud83d\udcc2 <strong>success.log<\/strong><\/p>\r\n<pre><code>2025-10-03 10:45:12 | Ba\u015far\u0131l\u0131: john.doe kullan\u0131c\u0131s\u0131 IT_Department grubuna eklendi.\r\n2025-10-03 10:45:15 | Ba\u015far\u0131l\u0131: jane.smith kullan\u0131c\u0131s\u0131 HR_Department grubuna eklendi.\r\n<\/code><\/pre>\r\n<p>\ud83d\udcc2 <strong>error.log<\/strong><\/p>\r\n<pre><code>2025-10-03 10:46:02 | Hata: mike.wilson i&ccedil;in i\u015flem ba\u015far\u0131s\u0131z -&gt; Cannot find an object with identity: 'mike.wilson'\r\n2025-10-03 10:46:10 | Hata: Bo\u015f kullan\u0131c\u0131 ad\u0131 veya grup ad\u0131 tespit edildi.\r\n<\/code><\/pre>\r\n<hr>\r\n<p>S&uuml;per \ud83d\udc4d O zaman blog yaz\u0131s\u0131n\u0131 geni\u015fletip <strong>CSV&rsquo;den kullan\u0131c\u0131lar\u0131 gruptan &ccedil;\u0131karma<\/strong> k\u0131sm\u0131n\u0131 da ekleyelim. Bu sayede tek CSV dosyas\u0131yla hem kullan\u0131c\u0131 ekleme hem de &ccedil;\u0131karma i\u015flemlerini y&ouml;netebilirsin.<\/p>\r\n<hr>\r\n<h2>6. CSV&rsquo;den Kullan\u0131c\u0131lar\u0131 Gruptan &Ccedil;\u0131karma<\/h2>\r\n<p>Bazen ihtiya&ccedil;, kullan\u0131c\u0131lar\u0131 gruplara eklemek yerine gruplardan &ccedil;\u0131karmak olabilir. Bunun i&ccedil;in <code>Remove-ADGroupMember<\/code> cmdlet&rsquo;i kullan\u0131l\u0131r. Mant\u0131k neredeyse ayn\u0131, sadece ekleme yerine &ccedil;\u0131karma yap\u0131l\u0131r.<\/p>\r\n<h3>&Ouml;rnek Script:<\/h3>\r\n<pre><code class=\"language-powershell\"># ============================\r\n# AD Kullan\u0131c\u0131lar\u0131n\u0131 Gruplardan CSV ile &Ccedil;\u0131karma\r\n# ============================\r\n\r\n# CSV dosya yolu\r\n$CSVPath = \"C:\\bulk_group\\remove_users.csv\"\r\n\r\n# Log dosya yollar\u0131\r\n$LogPath = \"C:\\bulk_group\\logs\"\r\n$SuccessLog = Join-Path $LogPath \"removed_success.log\"\r\n$ErrorLog   = Join-Path $LogPath \"removed_error.log\"\r\n\r\n# Log klas&ouml;r&uuml; yoksa olu\u015ftur\r\nif (-not (Test-Path $LogPath)) {\r\n    New-Item -ItemType Directory -Path $LogPath | Out-Null\r\n}\r\n\r\n# CSV'yi import et\r\n$Users = Import-Csv -Path $CSVPath\r\n\r\nforeach ($User in $Users) {\r\n    if ([string]::IsNullOrEmpty($User.SamAccountName) -or [string]::IsNullOrEmpty($User.GroupName)) {\r\n        $msg = \"Hata: Bo\u015f kullan\u0131c\u0131 ad\u0131 veya grup ad\u0131 tespit edildi.\"\r\n        Write-Host $msg -ForegroundColor Red\r\n        Add-Content -Path $ErrorLog -Value \"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | $msg\"\r\n        continue\r\n    }\r\n\r\n    try {\r\n        # Kullan\u0131c\u0131 ve grup kontrol&uuml;\r\n        $ADUser = Get-ADUser -Identity $User.SamAccountName -ErrorAction Stop\r\n        $ADGroup = Get-ADGroup -Identity $User.GroupName -ErrorAction Stop\r\n\r\n        # Kullan\u0131c\u0131 ger&ccedil;ekten grupta m\u0131?\r\n        $IsMember = Get-ADGroupMember -Identity $ADGroup | Where-Object { $_.SamAccountName -eq $User.SamAccountName }\r\n\r\n        if ($IsMember) {\r\n            # Kullan\u0131c\u0131y\u0131 gruptan &ccedil;\u0131kar\r\n            Remove-ADGroupMember -Identity $ADGroup -Members $ADUser -Confirm:$false -ErrorAction Stop\r\n            $msg = \"Ba\u015far\u0131l\u0131: $($User.SamAccountName) kullan\u0131c\u0131s\u0131 $($User.GroupName) grubundan &ccedil;\u0131kar\u0131ld\u0131.\"\r\n            Write-Host $msg -ForegroundColor Green\r\n            Add-Content -Path $SuccessLog -Value \"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | $msg\"\r\n        }\r\n        else {\r\n            $msg = \"Bilgi: $($User.SamAccountName) kullan\u0131c\u0131s\u0131 $($User.GroupName) grubunda bulunmuyor.\"\r\n            Write-Host $msg -ForegroundColor Yellow\r\n        }\r\n    }\r\n    catch {\r\n        $msg = \"Hata: $($User.SamAccountName) i&ccedil;in &ccedil;\u0131karma i\u015flemi ba\u015far\u0131s\u0131z -&gt; $($_.Exception.Message)\"\r\n        Write-Host $msg -ForegroundColor Red\r\n        Add-Content -Path $ErrorLog -Value \"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | $msg\"\r\n    }\r\n}\r\n<\/code><\/pre>\r\n<hr>\r\n<h3>CSV &Ouml;rne\u011fi<\/h3>\r\n<p>Kullan\u0131c\u0131lar\u0131 gruptan &ccedil;\u0131karmak i&ccedil;in CSV dosyan\u0131z \u015fu formatta olmal\u0131:<\/p>\r\n<pre><code class=\"language-csv\">SamAccountName,GroupName\r\njohn.doe,IT_Department\r\njane.smith,HR_Department\r\nmike.wilson,Finance_Group\r\n<\/code><\/pre>\r\n<hr>\r\n<h3>Log &Ccedil;\u0131kt\u0131s\u0131<\/h3>\r\n<p>\ud83d\udcc2 <strong>removed_success.log<\/strong><\/p>\r\n<pre><code>2025-10-03 12:15:05 | Ba\u015far\u0131l\u0131: john.doe kullan\u0131c\u0131s\u0131 IT_Department grubundan &ccedil;\u0131kar\u0131ld\u0131.\r\n<\/code><\/pre>\r\n<p>\ud83d\udcc2 <strong>removed_error.log<\/strong><\/p>\r\n<pre><code>2025-10-03 12:16:10 | Hata: mike.wilson i&ccedil;in &ccedil;\u0131karma i\u015flemi ba\u015far\u0131s\u0131z -&gt; Cannot find an object with identity: 'mike.wilson'\r\n<\/code><\/pre>\r\n<hr>\r\n<p>&nbsp;<\/p>\r\n<p>&nbsp;<\/p>\r\n<p>Bu y&ouml;ntemle y&uuml;zlerce kullan\u0131c\u0131y\u0131 tek seferde gruplara ekleyebilir, AD y&ouml;netim i\u015flerinizi &ccedil;ok daha h\u0131zl\u0131 ve pratik hale getirebilirsiniz. &Ouml;zellikle b&uuml;y&uuml;k organizasyonlarda, toplu i\u015flem yapmak i&ccedil;in bu tarz PowerShell scriptleri b&uuml;y&uuml;k kolayl\u0131k sa\u011flar.<\/p>\r\n<hr>\r\n<p>&nbsp;<\/p>","excerpt":"PowerShell kullanarak Active Directory gruplar\u0131na CSV dosyas\u0131ndan kullan\u0131c\u0131 import i\u015flemini kolayca yapabilirsiniz.","created_at":"2024-12-29 11:24:22","updated_at":"2026-09-07 22:30:09","category_id":8,"view_count":745,"reading_time":7,"status":"published","editor_choice":0,"is_editor_choice":0,"published_at":"2024-12-29 11:24:22","featured_image":"resimyok.jpg","slug":"powershell-kullanarak-active-directory-gruplarina-csv-dosyasindan-kullanici-import-islemi","category_name":"Active Directory \/Azure","category_slug":"active-directory-azure"}