Buat dan perbarui milis di Zimbra Collaboration OSE berdasarkan pada kelompok dan pengguna Direktori Aktif

gambar

1. Beberapa kata dari penulis


Artikel diperbarui. Skrip berubah. Skrip ditambahkan untuk memperbarui satu milis.

Dalam komentar pada artikel terakhir, saya ditanya pertanyaan menarik tentang pembentukan milis otomatis berdasarkan kelompok keamanan AD. Ada masalah - ada solusinya. Jadi ayo pergi.

2. Sumber data


Server OS : CentOS 7

Tentang OS
Faktanya, perbedaan antara CentOS7 dan sistem lainnya hanya akan terletak pada perintah ke server untuk menginstal paket, dan, mungkin, lokasi beberapa file. Pekerjaan dilakukan terutama dengan cmdlet Zimbra, sehingga perbedaan konfigurasi akan minimal.

Zimbra Domain : zimbramail.home.local
Jalan untuk memasang bola pada host Zimbra : / mnt / ZM /

3. Pengaturan


  1. Kami memasang bola Windows ke server Linux kami. Ini untuk menyederhanakan dan mengotomatiskan transfer data dari Windows PowerShell ke Linux Bash. Prosedur pemasangan dijelaskan dalam artikel sebelumnya. Saya tidak akan mengulangi lagi.
  2. Kami membuat OU terpisah dalam AD, di mana kami membuat grup berdasarkan milis yang akan dibuat di Zimbra. Nama grup = nama daftar distribusi.
  3. Kami menambahkan ke grup yang dibuat di OU baru, pengguna atau grup keamanan, berdasarkan mana milis di Zimbra akan diisi. Script berjalan secara rekursif, yang berarti akan mengumpulkan semua data tentang pengguna yang berada dalam grup yang ditambahkan ke grup di OU target. Pelajari lebih lanjut tentang output dari perintah Get-ADGroupMember .
  4. Buat skrip untuk mengumpulkan data dari Active Directory.
  5. Kami membuat skrip untuk menambahkan milis dan mengisinya oleh pengguna berdasarkan data yang diterima dalam skrip sebelumnya.
  6. Selamat menikmati.


3.1. Tentang OU


Saya membuat OU "ZimbraDL" di root domain dan melarangnya untuk mewarisi kebijakan grup sehingga grup-grup ini tetap terpisah. Mereka tidak akan berpartisipasi dalam kehidupan domain dengan cara apa pun, kecuali untuk pembentukan Daftar Distribusi di OSE Zimbra Collaboration.

4. Skrip PowerShell untuk mengumpulkan data dari AD


Script PowerShell
$Path = "C:\ZM\ZimbraDL" $enc = [system.text.encoding] function ReCode ( $f, $t, $line ) { $cp1 = $enc::getencoding( $f ) $cp2 = $enc::getencoding( $t ) $inputbytes = $enc::convert( $cp1, $cp2, $cp2.getbytes( $line )) $outputstring = $cp2.getstring( $inputbytes ) $outputstring | add-content $OutputFile } #  if(test-path $Path) { Remove-Item $Path -Recurse -Force } #   if(!(Test-Path $Path)) { New-Item -ItemType Directory -Force -Path $Path } if(!(Test-Path $Path\Groups)) { New-Item -ItemType Directory -Force -Path $Path\Groups } if(!(Test-Path $Path\Users)) { New-Item -ItemType Directory -Force -Path $Path\Users } if(!(Test-Path $Path\UsersTemp)) { New-Item -ItemType Directory -Force -Path $Path\UsersTemp } #   Import-Module ActiveDirectory Get-AdGroup -filter * -SearchBase "OU=ZimbraDL,DC=home,DC=local" | select samaccountname | Out-File $Path\Groups\GetGroupsAD.txt #   (Get-Content "$Path\Groups\GetGroupsAD.txt") -notmatch "samaccountname" | where {$_ -ne ""} | where {$_ -ne "--"} | Where-Object {$_ -notmatch '-'} | out-file "$Path\Groups\GetGroupsAD.txt" $File = @(Get-Content $Path\Groups\GetGroupsAD.txt) foreach ($File1 in $File) { $string=$File1.TrimStart('"') $string=$string.TrimEnd('"') $string=$string.TrimStart(' ') $string=$string.TrimEnd(' ') | Out-File $Path\Groups\GroupsListTemp.txt -Append } #   Remove-Item $Path\Groups\GetGroupsAD.txt -Force $InputFile = gc $Path\Groups\GroupsListTemp.txt $OutputFile = "$Path\Groups\GroupsList.txt" #  foreach ($line in $InputFile) { ReCode -f "windows-1251" -t "utf-8" $line } #   Remove-Item $Path\Groups\GroupsListTemp.txt -Force #        $GroupName = @(Get-Content $Path\Groups\GroupsList.txt) Foreach ($Group in $GroupName) { Get-ADGroupMember $Group -recursive | ft SamAccountName | out-file "$Path\UsersTemp\$Group.txt" -Append (get-content "$Path\UsersTemp\$Group.txt") -notmatch "Name" | where {$_ -ne ""} | where {$_ -ne "--"} | Where-Object {$_ -notmatch '-'} | out-file "$Path\UsersTemp\$Group.txt" $File=@(Get-Content $Path\UsersTemp\$Group.txt) foreach ($File1 in $File) { $string=$File1.TrimStart('"') $string=$string.TrimEnd('"') $string=$string.TrimStart(' ') $string=$String.TrimEnd(' ') | Out-File "$Path\UsersTemp\$Group" -Append } $InputFile = gc $Path\UsersTemp\$Group $OutputFile = "$Path\Users\$Group" #  foreach ($line in $InputFile) { ReCode -f "windows-1251" -t "utf-8" $line } } #    Remove-Item "$Path\UsersTemp\" -Recurse -Force Remove-Item "$Path\Groups" -Recurse -Force 


4.1. Cara kerja skrip


  1. Pertama, ia memeriksa keberadaan dan penghapusan direktori kerja, jika ada. Ini diperlukan agar data tidak menggandakan dalam proses.
  2. PoSh melihat OU yang ditentukan, membaca grup pengguna yang ada di dalamnya, dan menulisnya ke file GetGroupsAD.txt
  3. Buang apapun yang berlebihan dari file yang diterima (PoSh menulis semua outputnya ke file, jadi pada output awal dari perintah, baris pertama adalah Nama, baris kedua adalah pemisah "----", dan hanya setelah itu kelompok-kelompok terdaftar satu per satu), mengubah pengkodean dari "windows-1251" ke utf-8, menghasilkan file lain GroupsList.txt
  4. Selanjutnya, berdasarkan file yang diterima, informasi tentang pengguna grup yang terkandung dalam file dibaca. File yang berisi nama pengguna (samAccountName)
    ditempatkan di direktori \ Users dan dipanggil dengan nama grup


4.2. Skrip untuk membaca informasi dari satu grup


Sebuah skrip dengan kemampuan membaca data hanya dari satu grup keamanan tidak jauh berbeda dari yang sebelumnya, pada dasarnya karena memiliki blok yang meminta pengguna untuk memasukkan nama grup, berdasarkan mana milis perlu diperbarui.

Skrip PowerShell dijalankan dengan tangan dengan kemampuan membaca data hanya dari satu grup
 $Path = "C:\ZM\ZimbraDL" $enc = [system.text.encoding] function ReCode ( $f, $t, $line ) { $cp1 = $enc::getencoding( $f ) $cp2 = $enc::getencoding( $t ) $inputbytes = $enc::convert( $cp1, $cp2, $cp2.getbytes( $line )) $outputstring = $cp2.getstring( $inputbytes ) $outputstring | add-content $OutputFile } #  if(test-path $Path) { Remove-Item $Path -Recurse -Force } #   if(!(test-path $Path)) { New-Item -ItemType Directory -Force -Path $Path } if(!(Test-Path $Path\Groups)) { New-Item -ItemType Directory -Force -Path $Path\Groups } if(!(Test-Path $Path\Users)) { New-Item -ItemType Directory -Force -Path $Path\Users } if(!(Test-Path $Path\UsersTemp)) { New-Item -ItemType Directory -Force -Path $Path\UsersTemp } #   Import-Module ActiveDirectory $Groupname = Read-Host '  ,   ,  ALL     ' If ($Groupname -eq "ALL") { Get-AdGroup -filter * -SearchBase "OU=ZimbraDL,DC=home,DC=local" | select samaccountname | Out-File $path\Groups\GetGroupsAD.txt } Else { $Groupname > "$Path\Groups\GetGroupsAD.txt" } #   (Get-Content "$Path\Groups\GetGroupsAD.txt") -notmatch "samaccountname" | where {$_ -ne ""} | where {$_ -ne "--"} | Where-Object {$_ -notmatch '-'} | out-file "$Path\Groups\GetGroupsAD.txt" $File = @(Get-Content $Path\Groups\GetGroupsAD.txt) foreach ($File1 in $File) { $string=$File1.TrimStart('"') $string=$string.TrimEnd('"') $string=$string.TrimStart(' ') $string=$string.TrimEnd(' ') | Out-File $Path\Groups\GroupsListTemp.txt -Append } Remove-Item $Path\Groups\GetGroupsAD.txt -Force $InputFile = gc $Path\Groups\GroupsListTemp.txt $OutputFile = "$Path\Groups\GroupsList.txt" foreach ($line in $InputFile) { ReCode -f "windows-1251" -t "utf-8" $line } Remove-Item $Path\Groups\GroupsListTemp.txt -Force #        $GroupName = @(Get-Content $Path\Groups\GroupsList.txt) Foreach ($Group in $GroupName) { Get-ADGroupMember $Group -recursive | ft SamAccountName | out-file "$Path\UsersTemp\$Group.txt" -Append (get-content "$Path\UsersTemp\$Group.txt") -notmatch "Name" | where {$_ -ne ""} | where {$_ -ne "--"} | Where-Object {$_ -notmatch '-'} | out-file "$Path\UsersTemp\$Group.txt" $File=@(Get-Content $Path\UsersTemp\$Group.txt) foreach ($File1 in $File) { $string=$File1.TrimStart('"') $string=$string.TrimEnd('"') $string=$string.TrimStart(' ') $string=$String.TrimEnd(' ') | Out-File "$Path\UsersTemp\$Group" -Append } $InputFile = gc $Path\UsersTemp\$Group $OutputFile = "$Path\Users\$Group" foreach ($line in $InputFile) { ReCode -f "windows-1251" -t "utf-8" $line } } Remove-Item "$Path\UsersTemp\" -Recurse -Force Remove-Item "$Path\Groups" -Recurse -Force 



5. Bash script untuk membuat milis


Saya akan membuat reservasi tentang menyalin file skrip yang dibuat di Windows
Dalam artikel sebelumnya, kami menjelaskan metode untuk memformat file menggunakan perintah cat, yang, ketika diluncurkan dengan kunci tertentu, menghapus semua karakter yang tidak dapat dibaca yang tidak perlu. Tautkan ke artikel di akhir artikel.

Skrip Bash
 #!/bin/bash #  #    Path="/mnt/ZM/ZimbraDL" #  Zimbra Domain="zimbramail.home.local" #   zmprov zmprov="/opt/zimbra/bin/zmprov" #  - log="/mnt/ZM/DLlog.txt" #       DLnames="/mnt/ZM/DLnames" #       UserNames="/mnt/ZM/Usernames" #   echo "  ..." ls $Path/Users > $DLnames if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]" echo echo -en "ls directory for Groups correct $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "ls directory for Groups INcorrect $(date +%T)\n" >> $log fi #   echo "   " for DLname in $( cat $DLnames); do #    echo "    $DLname..." Result=$($zmprov gdl $DLname@$Domain) if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "DL $DLname exist $(date +%T)\n" >> $log #   echo -en "Start deleting DL for group $DLname $(date +%T)\n" >> $log echo "   $DLname..." $zmprov ddl $DLname@$Domain if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]" echo echo -en "DL for group $DLname is deleted in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "DL for group $DLname is NOT deleted in $(date +%T)\n" >> $log fi else echo -n "$(tput hpa $(tput cols))$(tput cub 6)[FAIL]" echo echo -en "DL $DLname not exist! $(date +%T)\n" >> $log fi done for DLname in $( cat $DLnames); do #   echo -en "Start create DL for group $DLname $(date +%T)\n" >> $log echo "     AD $DLname..." $zmprov cdl $DLname@$Domain if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]" echo echo -en "DL for group $DLname is created in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "DL for group $DLname is NOT created in $(date +%T)\n" >> $log fi #   echo "  " for UserName in $( cat $Path/Users/$DLname); do echo "     $UserName..." Result=$($zmprov gmi $UserName@$Domain) if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]" echo echo -en "MilBox for user $UserName exist $(date +%T)\n" >> $log echo "  $UserName    $DLname@$Domain..." $zmprov adlm $DLname@$Domain $UserName@$Domain if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6) [OK]" echo echo -en "User $UserName added in $DLname@$Domain correctly in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "DL for group $DLname is NOT created in $(date +%T)\n" >> $log fi else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "MilBox for user $UserName is NOT exist $(date +%T)\n" >> $log fi done done #   echo "  " echo "    ..." echo -n > $DLnames if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "File $DLnames was successfull cleared in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "File $DLnames was NOT cleared in $(date +%T)\n" >> $log fi # ,      echo "   $Path    ..." rm -rf $Path if [ $? -eq 0 ]; then echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]" echo echo -en "Directory $Path was seccessfull deleted in $(date +%T)\n" >> $log else echo -n "$(tput hpa $(tput cols))$(tput cub 6) [FAIL]" echo echo -en "Directory $Path was NOT deleted in $(date +%T)\n" >> $log fi #  -      echo -en "Job complete in $(date +%T)\n" >> $log echo -en "____________________________________\n" >> $log 


5.1. Cara kerja skrip


  1. Tulis daftar grup ke file
  2. Periksa keberadaan milis di Zimbra, jika ada, hapus saja
  3. Buat milis satu per satu berdasarkan daftar grup, isi masing-masing dengan pengguna (ID dari daftar distribusi ditampilkan di layar, ini adalah output standar cmdlet zmprov saat membuat DL). Ini memeriksa keberadaan kotak surat pengguna di Zimbra, dan jika kotak surat itu tidak ada, pengguna tidak akan ditambahkan ke milis. Anda tentu saja dapat membuat kotak surat baru untuk pengguna dan menambahkannya ke milis, tetapi saya berasumsi bahwa Zimbra autoprov bekerja dalam mode Eager, dan jika pengguna tidak dibuat secara otomatis, maka ia tidak ada hubungannya di dalam sistem
  4. Hapus file sementara
  5. Hapus direktori yang berfungsi

6. Kesimpulan


Secara umum, tugasnya tidak sulit, masalahnya hanya dalam mentransfer data dari PowerShell ke Bash. Untuk waktu yang lama saya mencoba menemukan alat untuk menyalin file teks dengan output PoSh ke dalam bentuk Bash-digestible. Hasil pencarian selama beberapa hari adalah fungsinya:

Fungsi Pengodean Ulang
 $InputFile = gc File1.txt $OutputFile = "File2.txt" $enc = [system.text.encoding] function ReCode ( $f, $t, $line ) { $cp1 = $enc::getencoding( $f ) $cp2 = $enc::getencoding( $t ) $inputbytes = $enc::convert( $cp1, $cp2, $cp2.getbytes( $line )) $outputstring = $cp2.getstring( $inputbytes ) $outputstring | add-content $OutputFile } foreach ($line in $InputFile) { ReCode -f "windows-1251" -t "utf-8" $line } 


Mungkin seseorang akan berguna.

7. PS:


Ini adalah artikel ketiga dalam seri β€œBagaimana Saya Menerapkan Zimbra.” Yang pertama adalah tentang implementasi, otorisasi LDAP dan pembuatan kotak surat otomatis untuk pengguna AD, di sini . Yang kedua, tentang mengatur cadangan dan pemulihan Zimbra secara keseluruhan dan dalam kotak terpisah, ada di sini .

Source: https://habr.com/ru/post/id443166/


All Articles