إنشاء وتحديث القوائم البريدية في Zimbra Collaboration OSE بناءً على مجموعات Active Directory والمستخدمين

الصورة

1. بضع كلمات من المؤلف


تحديث المادة. تغيرت البرامج النصية. تمت إضافة البرنامج النصي لتحديث قائمة بريدية واحدة.

في التعليقات على المقالة الأخيرة ، سُئل سؤالًا مثيرًا للاهتمام حول التكوين التلقائي لقوائم البريد بناءً على مجموعات الأمان AD. هناك مشكلة - هناك حل. لذلك دعونا نذهب.

2. مصدر البيانات


خادم نظام التشغيل : CentOS 7

حول نظام التشغيل
في الواقع ، فإن الفرق بين CentOS7 وأي نظام آخر يكمن فقط في أوامر الخادم لتثبيت الحزم ، وربما موقع بعض الملفات. يتم تنفيذ العمل بشكل أساسي باستخدام أوامر cmdlets من طراز Zimbra ، وبالتالي ستكون فروق التكوين ضئيلة للغاية.

Zimbra المجال : zimbramail.home.local
مسار تحميل الكرات على مضيف Zimbra : / mnt / ZM /

3. الإعداد


  1. نقوم بتركيب كرة الويندوز على خادم Linux الخاص بنا. هذا هو تبسيط ونقل البيانات من Windows PowerShell إلى Linux Bash. تم وصف إجراء التركيب في مقال سابق. لن أكرر نفسي.
  2. ننشئ OU منفصلة في م ، والتي ننشئ مجموعات على أساسها سيتم إنشاء قوائم بريدية في Zimbra. اسم المجموعة = اسم قائمة التوزيع.
  3. نضيف إلى المجموعات التي تم إنشاؤها في OU الجديدة ، المستخدمين أو مجموعات الأمان ، والتي سيتم على أساسها نشر قوائم المراسلات في Zimbra. يتم تشغيل البرنامج النصي بشكل متكرر ، مما يعني أنه سيجمع كل البيانات حول المستخدمين الموجودين في مجموعات تضاف إلى مجموعات في OU الهدف. تعرف على المزيد حول إخراج الأمر Get-ADGroupMember .
  4. قم بإنشاء برنامج نصي لجمع البيانات من Active Directory.
  5. نقوم بإنشاء برنامج نصي لإضافة قوائم بريدية وتعبئتها بواسطة المستخدمين استنادًا إلى البيانات الواردة في البرنامج النصي السابق.
  6. استمتع


3.1. حول OU


لقد أنشأت OU "ZimbraDL" في جذر المجال وحظرت عليه أن يرث سياسات المجموعة بحيث تظل هذه المجموعات منفصلة. لن يشاركوا في حياة المجال بأي طريقة ، باستثناء تكوين قوائم التوزيع في بيئة نظام التشغيل Zimbra Collaboration OSE.

4. برنامج PowerShell النصي لجمع البيانات من م


برنامج 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. كيف يعمل البرنامج النصي


  1. أولاً ، يتحقق من وجود دليل العمل وحذفه ، إذا كان موجودًا. يعد ذلك ضروريًا حتى لا تتضاعف البيانات في العملية.
  2. ينظر PoSh إلى OU المحدد ، ويقرأ مجموعات المستخدمين الموجودة فيه ، ويكتبها في ملف GetGroupsAD.txt
  3. يتجاهل أي شيء لا لزوم له من الملف المستلم (PoSh يكتب كل مخرجاته إلى الملف ، لذلك في الإخراج الأولي للأمر ، السطر الأول هو الاسم ، السطر الثاني هو الفاصل "----" ، وبعد أن يتم سرد المجموعات واحدة تلو الأخرى) ، يتغير الترميز من "windows-1251" إلى utf-8 ، مما أدى إلى ملف GroupList.txt آخر
  4. علاوة على ذلك ، استنادًا إلى الملف الذي تم استلامه ، تتم قراءة المعلومات حول مستخدمي المجموعات الموجودة في الملف. الملفات التي تحتوي على أسماء المستخدمين (samAccountName)
    وضعت في الدليل \ المستخدمين ودعا باسم المجموعة


4.2. البرنامج النصي لقراءة المعلومات من مجموعة واحدة


لا يختلف البرنامج النصي الذي لديه القدرة على قراءة البيانات من مجموعة أمان واحدة فقط عن المجموعة السابقة ، وذلك لأنه يحتوي على كتلة تطلب من المستخدم إدخال اسم المجموعة ، بناءً على القائمة البريدية التي ستحتاج إلى تحديث.

سيتم تشغيل البرنامج النصي 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 $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. باش النصي لإنشاء قوائم بريدية


سوف أبدي تحفظًا حول نسخ ملفات البرامج النصية التي تم إنشاؤها بموجب Windows
في مقالة سابقة ، وصفنا طريقة لتنسيق الملفات باستخدام الأمر cat ، والتي عندما يتم تشغيلها باستخدام مفتاح معين ، تزيل جميع الأحرف غير القابلة للقراءة غير الضرورية. رابط للمقال في نهاية المقال.

باش النصي
 #!/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. كيف يعمل البرنامج النصي


  1. اكتب قائمة مجموعات لملف
  2. تحقق من وجود القائمة البريدية في Zimbra ؛ إذا كانت موجودة ، احذفها
  3. إنشاء قوائم بريدية واحدة تلو الأخرى بناءً على قائمة المجموعات ، وملء كل منها بالمستخدمين (يتم عرض معرّف قائمة التوزيع على الشاشة ، وهذا هو الإخراج القياسي لـ cmdlet zmprov عند إنشاء DL). يتحقق هذا من وجود صناديق بريد المستخدم في Zimbra ، وإذا لم يكن صندوق البريد موجودًا ، فلن تتم إضافة المستخدم إلى القائمة البريدية. يمكنك بالطبع إنشاء صندوق بريد جديد للمستخدم وإضافته إلى القائمة البريدية ، لكنني أفترض أن Zimbra autoprov يعمل في وضع Eager ، وإذا لم يتم إنشاء المستخدم تلقائيًا ، فلن يقوم بأي شيء في النظام
  4. مسح الملفات المؤقتة
  5. حذف دليل العمل

6. الخاتمة


بشكل عام ، لم تكن المهمة صعبة ، المشكلة كانت فقط في نقل البيانات من PowerShell إلى Bash. حاولت لفترة طويلة العثور على أداة لتسجيل الملفات النصية مع إخراج PoSh في شكل Bash-digestible. كانت نتيجة البحث لعدة أيام هي الوظيفة:

إعادة ترميز وظيفة
 $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 } 


ربما شخص ما سيكون مفيدا.

7. ملاحظة:


هذا هو المقال الثالث في سلسلة "كيف نفذت زيمبرا". الأول يدور حول التطبيق وترخيص LDAP وإنشاء صناديق البريد تلقائيًا لمستخدمي م ، هنا . الثاني ، حول إعداد النسخ الاحتياطي واسترداد Zimbra في مجملها وفي صناديق منفصلة ، هنا .

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


All Articles