راهنمای کامل مدیریت و عیب‌یابی Microsoft 365 برای تکنسین‌های هلپ دسک

راهنمای عملی مدیریت و عیب‌یابی Microsoft 365 شامل دستورات PowerShell، رفع مشکلات Exchange Online، Teams، OneDrive و SharePoint، نکات امنیتی و اسکریپت‌های اتوماسیون برای تکنسین‌های هلپ دسک.

راهنمای کامل مدیریت و عیب‌یابی Microsoft 365 برای تکنسین‌های هلپ دسک

اگه تو تیم هلپ دسک یا پشتیبانی IT کار می‌کنید، احتمالاً خودتون بهتر از هر کسی می‌دونید که Microsoft 365 چه نقش حیاتی‌ای در سازمان‌ها داره. از ایمیل و Teams گرفته تا مسائل لایسنس و امنیت — روزی نیست که چندتا تیکت مرتبط با این پلتفرم نداشته باشید. صادقانه بگم، داشتن دانش عمیق در مدیریت و عیب‌یابی Microsoft 365 دیگه یه مهارت لوکس نیست؛ یه ضرورته.

چرا اینقدر تأکید دارم؟ بذارید یه مثال واقعی بزنم.

در ۲۲ تا ۲۳ ژانویه ۲۰۲۶، مایکروسافت یکی از بزرگ‌ترین قطعی‌های سال رو تجربه کرد. Exchange Online، Teams و SharePoint نزدیک ۲۴ ساعت از دسترس خارج شدند. علت اولیه این بود که زیرساخت سرویس ترافیک رو درست پردازش نمی‌کرد و تلاش ناموفق برای بازیابی (botched recovery attempt) اوضاع رو بدتر کرد. تو اون ۲۴ ساعت، تیم‌های هلپ دسک در سراسر دنیا زیر بار صدها تیکت از کاربران ناراضی له شدند. این رویداد نشون داد که آمادگی برای مدیریت بحران واقعاً حیاتیه.

خب، بیاید شروع کنیم. تو این مقاله، تمام جنبه‌های مدیریت و عیب‌یابی Microsoft 365 رو از نگاه تیم هلپ دسک بررسی می‌کنیم. اگه قبلاً مقاله ما درباره عیب‌یابی Active Directory رو خوندید، این مقاله مکمل اون هست و تمرکزش روی سرویس‌های ابری مایکروسافته.

آشنایی با Microsoft 365 Admin Center

مرکز مدیریت Microsoft 365 (از طریق admin.microsoft.com) قلب تپنده مدیریت تمام سرویس‌های ابری مایکروسافت تو سازمان شماست. به عنوان تکنسین هلپ دسک، باید با بخش‌های مختلف این پنل آشنا باشید — و منظورم واقعاً آشنایی عمیقه، نه فقط یه نگاه سطحی.

بخش‌های کلیدی Admin Center

وقتی وارد Admin Center می‌شید، یه داشبورد مرکزی می‌بینید که خلاصه‌ای از وضعیت سازمان رو نشون می‌ده. بخش‌های اصلی اینا هستند:

  • Users (کاربران): مدیریت حساب‌های کاربری، بازنشانی رمز عبور، تخصیص لایسنس و مدیریت گروه‌ها. این بخشیه که احتمالاً بیشترین وقتتون رو توش صرف می‌کنید.
  • Groups (گروه‌ها): ایجاد و مدیریت گروه‌های Microsoft 365، گروه‌های توزیع (Distribution Groups)، گروه‌های امنیتی و گروه‌های mail-enabled.
  • Billing (صورتحساب): مدیریت اشتراک‌ها، مشاهده لایسنس‌های موجود و مصرف‌شده، و خرید سرویس‌های اضافی.
  • Health (سلامت سرویس): یکی از مهم‌ترین بخش‌ها برای ما تکنسین‌ها. اینجا می‌تونید وضعیت تمام سرویس‌های مایکروسافت رو Real-time ببینید.
  • Settings (تنظیمات): تنظیمات سطح سازمان شامل دامنه‌ها، تنظیمات امنیتی و پیکربندی سرویس‌ها.
  • Reports (گزارش‌ها): گزارش‌های مصرف سرویس، فعالیت کاربران و آمار ایمیل.

Service Health Dashboard

داشبورد سلامت سرویس اولین جاییه که باید هنگام دریافت تیکت‌های گسترده بررسی کنید. جدی می‌گم — اول از همه اینجا رو چک کنید. این داشبورد تو مسیر Health > Service health قرار داره و اطلاعات زیر رو نمایش می‌ده:

  • وضعیت فعلی تمام سرویس‌های Microsoft 365
  • حوادث فعال (Active Incidents) و هشدارها (Advisories)
  • تاریخچه حوادث گذشته
  • زمان تخمینی رفع مشکل (ETA)
  • بروزرسانی‌های مایکروسافت درباره روند رفع مشکل

نکته مهم: قبل از شروع عیب‌یابی هر مشکلی که چندین کاربر گزارش کردند، همیشه اول Service Health Dashboard رو بررسی کنید. اگه مشکل از سمت مایکروسافت باشه، تلاش برای عیب‌یابی محلی بی‌فایده‌ست و فقط وقت شما و کاربر رو هدر می‌ده.

مدیریت کاربران و لایسنس‌ها

مدیریت کاربران و لایسنس‌ها یکی از پرتکرارترین وظایف تیم هلپ دسکه. از ایجاد حساب کاربری جدید برای کارمندان تازه‌وارد گرفته تا تخصیص و تغییر لایسنس‌ها — این کارها باید سریع و بدون خطا انجام بشن.

ایجاد و مدیریت کاربران

برای ایجاد کاربر جدید تو Admin Center، مسیر Users > Active users > Add a user رو دنبال کنید. ولی وقتی تعداد کاربران زیاده یا نیاز به اتوماسیون دارید، PowerShell بهترین دوست شماست.

یه نکته خیلی مهم: ماژول قدیمی AzureAD PowerShell از سال ۲۰۲۵ کاملاً بازنشسته شده. اگه هنوز از دستورات قدیمی مثل Get-AzureADUser یا Connect-AzureAD استفاده می‌کنید، باید هرچه سریع‌تر به Microsoft Graph PowerShell SDK مهاجرت کنید. جدی می‌گم، این رو عقب ننداخت.

# نصب Microsoft Graph PowerShell SDK
Install-Module Microsoft.Graph -Scope CurrentUser

# اتصال به Microsoft Graph
Connect-MgGraph -Scopes "User.ReadWrite.All", "Directory.ReadWrite.All"

# دریافت لیست تمام کاربران فعال
Get-MgUser -Filter "accountEnabled eq true" -All | Select-Object DisplayName, UserPrincipalName, Mail

# دریافت اطلاعات یک کاربر خاص
Get-MgUser -UserId "[email protected]" | Format-List DisplayName, UserPrincipalName, JobTitle, Department, AccountEnabled

# ایجاد کاربر جدید
$passwordProfile = @{
    Password = "TempP@ssw0rd123!"
    ForceChangePasswordNextSignIn = $true
}

New-MgUser -DisplayName "Ali Mohammadi" `
    -UserPrincipalName "[email protected]" `
    -MailNickname "a.mohammadi" `
    -PasswordProfile $passwordProfile `
    -AccountEnabled:$true `
    -Department "IT" `
    -JobTitle "System Administrator" `
    -UsageLocation "IR"

# غیرفعال کردن حساب کاربری (مثلاً هنگام خروج کارمند)
Update-MgUser -UserId "[email protected]" -AccountEnabled:$false

# بازنشانی رمز عبور کاربر
$newPassword = @{
    Password = "NewTempP@ss123!"
    ForceChangePasswordNextSignIn = $true
}
Update-MgUser -UserId "[email protected]" -PasswordProfile $newPassword

مدیریت لایسنس‌ها

مدیریت صحیح لایسنس‌ها هم از نظر هزینه و هم از نظر عملکرد اهمیت زیادی داره. لایسنس‌های اضافی هزینه غیرضروری ایجاد می‌کنن و لایسنس‌های کم باعث اختلال در کار کاربران می‌شن. یه تعادل ظریف وجود داره که باید حفظش کنید.

نکته مهم درباره قیمت‌ها: مایکروسافت اعلام کرده که افزایش قیمت لایسنس‌های Microsoft 365 برای تمدیدهای پس از اول جولای ۲۰۲۶ (۱۰ تیر ۱۴۰۵) اعمال خواهد شد. حتماً این موضوع رو به تیم مدیریت اطلاع بدید تا برنامه‌ریزی بودجه‌ای لازم انجام بشه.

# مشاهده لایسنس‌های موجود در سازمان
Get-MgSubscribedSku | Select-Object SkuPartNumber,
    @{N="Total";E={$_.PrepaidUnits.Enabled}},
    @{N="Assigned";E={$_.ConsumedUnits}},
    @{N="Available";E={$_.PrepaidUnits.Enabled - $_.ConsumedUnits}}

# مشاهده لایسنس‌های یک کاربر خاص
Get-MgUserLicenseDetail -UserId "[email protected]" | Select-Object SkuPartNumber, SkuId

# تخصیص لایسنس به کاربر
$licenseToAssign = @{
    AddLicenses = @(
        @{
            SkuId = "05e9a617-0261-4cee-bb36-b42a5c29a8d5"  # Microsoft 365 E3
        }
    )
    RemoveLicenses = @()
}
Set-MgUserLicense -UserId "[email protected]" -BodyParameter $licenseToAssign

# حذف لایسنس از کاربر
$licenseToRemove = @{
    AddLicenses = @()
    RemoveLicenses = @("05e9a617-0261-4cee-bb36-b42a5c29a8d5")
}
Set-MgUserLicense -UserId "[email protected]" -BodyParameter $licenseToRemove

# گزارش کاربران بدون لایسنس
Get-MgUser -Filter "assignedLicenses/`$count eq 0" -ConsistencyLevel eventual -CountVariable count -All |
    Select-Object DisplayName, UserPrincipalName, AccountEnabled

بهترین شیوه‌های مدیریت لایسنس

برای جلوگیری از مشکلات لایسنس، این نکات رو رعایت کنید:

  • هشدار در آستانه ۸۰٪: وقتی مصرف لایسنس به ۸۰٪ ظرفیت خریداری شده رسید، هشدار تنظیم کنید. فرصت کافی برای خرید لایسنس اضافی لازمه.
  • هشدار بحرانی در ۹۵٪: در این آستانه هشدار بحرانی بزنید. تو این مرحله واقعاً وقت تنگه.
  • بررسی ماهانه: هر ماه لایسنس‌های تخصیص داده شده به کاربران غیرفعال یا خارج‌شده رو بازبینی کنید. باور کنید، تعداد لایسنس‌هایی که هدر میره بیشتر از چیزیه که فکر می‌کنید.
  • استفاده از گروه‌ها: از Group-based Licensing استفاده کنید تا تخصیص لایسنس خودکار بر اساس عضویت گروه انجام بشه.

عیب‌یابی مشکلات ایمیل در Exchange Online

مشکلات ایمیل همیشه جزو پرتکرارترین تیکت‌های هلپ دسک بودن و هستن. وقتی کاربر نمی‌تونه ایمیل بفرسته یا دریافت کنه، کارش عملاً متوقف می‌شه. پس سرعت عمل در تشخیص و رفع این مشکلات خیلی مهمه.

مشکلات رایج ایمیل

رایج‌ترین مشکلاتی که تو Exchange Online باهاشون مواجه می‌شید:

  • عدم امکان ارسال ایمیل: کاربر ایمیل می‌نویسه ولی ایمیل تو Outbox گیر می‌کنه یا خطای ارسال می‌گیره.
  • عدم دریافت ایمیل: ایمیل‌ها به صندوق ورودی نمی‌رسن. ممکنه تو Quarantine باشن یا توسط Transport Rules بلوکه شده باشن.
  • خطای "451 4.3.2 temporary server issue": معمولاً نشون‌دهنده مشکل موقت سرور Exchangeه. اگه بیش از چند ساعت ادامه داشت، باید عمیق‌تر بررسی کنید.
  • مشکلات اتصال Outlook: Outlook به سرور متصل نمی‌شه یا مدام قطع و وصل می‌شه.
  • ایمیل‌های گم‌شده: کاربر انتظار دریافت ایمیلی رو داره که هرگز نرسیده.

استفاده از Message Trace

ابزار Message Trace در Exchange Admin Center یکی از قدرتمندترین ابزارهای عیب‌یابی ایمیله. با این ابزار می‌تونید مسیر هر ایمیلی رو از فرستنده تا گیرنده ردیابی کنید و ببینید دقیقاً کجا مشکل رخ داده.

برای دسترسی، به Exchange Admin Center > Mail flow > Message trace برید. همچنین می‌تونید از PowerShell استفاده کنید:

# اتصال به Exchange Online PowerShell
Connect-ExchangeOnline -UserPrincipalName [email protected]

# ردیابی ایمیل‌های ارسال‌شده توسط یک کاربر در ۲ روز اخیر
Get-MessageTrace -SenderAddress "[email protected]" -StartDate (Get-Date).AddDays(-2) -EndDate (Get-Date) |
    Select-Object Received, SenderAddress, RecipientAddress, Subject, Status, MessageId |
    Format-Table -AutoSize

# ردیابی ایمیل‌های دریافتی یک کاربر
Get-MessageTrace -RecipientAddress "[email protected]" -StartDate (Get-Date).AddDays(-2) -EndDate (Get-Date) |
    Select-Object Received, SenderAddress, RecipientAddress, Subject, Status |
    Format-Table -AutoSize

# بررسی ایمیل‌های Failed
Get-MessageTrace -Status "Failed" -StartDate (Get-Date).AddDays(-7) -EndDate (Get-Date) |
    Select-Object Received, SenderAddress, RecipientAddress, Subject, Status |
    Format-Table -AutoSize

# جزئیات بیشتر درباره یک ایمیل خاص
Get-MessageTraceDetail -MessageTraceId "trace-id-here" -RecipientAddress "[email protected]" |
    Select-Object Date, Event, Action, Detail |
    Format-List

بررسی قوانین انتقال ایمیل و Connectorها

گاهی مشکل ایمیل به خاطر Transport Rules یا Connectorهای نادرسته. این قوانین می‌تونن ایمیل‌ها رو بلوکه، ریدایرکت یا تغییر بدن بدون اینکه کاربر حتی بفهمه. من خودم چندین بار ساعت‌ها وقت صرف عیب‌یابی کردم تا فهمیدم یه Transport Rule داره ایمیل‌ها رو ریدایرکت می‌کنه!

# مشاهده تمام قوانین انتقال فعال
Get-TransportRule | Where-Object {$_.State -eq "Enabled"} |
    Select-Object Name, Priority, State, Mode |
    Format-Table -AutoSize

# مشاهده جزئیات یک قانون خاص
Get-TransportRule -Identity "Rule Name" | Format-List

# بررسی Connectorهای ورودی
Get-InboundConnector | Select-Object Name, Enabled, SenderDomains, ConnectorType |
    Format-Table -AutoSize

# بررسی Connectorهای خروجی
Get-OutboundConnector | Select-Object Name, Enabled, RecipientDomains, ConnectorType |
    Format-Table -AutoSize

# بررسی وضعیت صندوق پستی کاربر
Get-Mailbox -Identity "[email protected]" |
    Select-Object DisplayName, PrimarySmtpAddress, RecipientType,
    ProhibitSendQuota, ProhibitSendReceiveQuota, IssueWarningQuota |
    Format-List

# بررسی حجم فعلی صندوق پستی
Get-MailboxStatistics -Identity "[email protected]" |
    Select-Object DisplayName, TotalItemSize, ItemCount, LastLogonTime

ابزار Self-help Diagnostics

مایکروسافت ابزارهای تشخیصی خودکار رو مستقیماً تو Admin Center قرار داده. برای استفاده، تو Admin Center عبارت مشکل رو تو قسمت "Need Help?" جستجو کنید. مثلاً عبارت "user can't send email" رو تایپ کنید و سیستم خودکار تست‌های تشخیصی مربوطه رو اجرا می‌کنه. خیلی وقت‌ها این ابزار ساده می‌تونه مشکل رو سریع‌تر از هر روش دیگه‌ای پیدا کنه.

عیب‌یابی مشکلات Microsoft Teams

Teams دیگه به ابزار اصلی ارتباطات بیشتر سازمان‌ها تبدیل شده و مشکلاتش مستقیماً روی بهره‌وری تیم‌ها تأثیر می‌ذاره. بیاید نگاهی به رایج‌ترین مشکلات و راه‌حل‌هاشون بندازیم.

مشکلات رایج Teams

  • عدم امکان ایجاد چت یا ارسال پیام: معمولاً به دلیل مشکلات لایسنس، سیاست‌های محدودکننده، یا مشکل کش برنامه‌ست.
  • مشکلات جلسات آنلاین: عدم امکان ایجاد یا پیوستن به جلسات، مشکلات صدا و تصویر.
  • مشکلات کیفیت صدا و تصویر: صدای قطع و وصل، تصویر تار یا فریز شده، تأخیر زیاد (این از اون دسته مشکلاتیه که واقعاً کاربرا رو کلافه می‌کنه).
  • عدم نمایش کانال‌ها یا تیم‌ها: کاربر عضو یه تیمه ولی نمی‌تونه ببینتش.
  • مشکلات همگام‌سازی فایل‌ها: فایل‌ها تو تب Files نمایش داده نمی‌شن یا آپلود نمی‌شن.

پاک کردن کش Teams

یکی از اولین و مؤثرترین اقدامات برای رفع مشکلات Teams، پاک کردن کش برنامه‌ست. تو تجربه من، این کار تقریباً ۶۰ تا ۷۰ درصد مشکلات مربوط به نمایش، همگام‌سازی و عملکرد رو حل می‌کنه.

# ابتدا Teams را کاملاً ببندید
# سپس دستورات زیر را در PowerShell اجرا کنید:

# برای Teams جدید (New Teams / Teams 2.x)
$teamsNewCachePath = "$env:LOCALAPPDATA\Packages\MSTeams_8wekyb3d8bbwe\LocalCache\Microsoft\MSTeams"
if (Test-Path $teamsNewCachePath) {
    Remove-Item -Path $teamsNewCachePath -Recurse -Force
    Write-Output "New Teams cache cleared successfully."
}

# برای Teams کلاسیک (در صورت استفاده)
$teamsClassicCachePaths = @(
    "$env:APPDATA\Microsoft\Teams\Cache",
    "$env:APPDATA\Microsoft\Teamslob_storage",
    "$env:APPDATA\Microsoft\Teams\databases",
    "$env:APPDATA\Microsoft\Teams\GPUcache",
    "$env:APPDATA\Microsoft\Teams\IndexedDB",
    "$env:APPDATA\Microsoft\Teams\Local Storage",
    "$env:APPDATA\Microsoft\Teams\tmp"
)

foreach ($path in $teamsClassicCachePaths) {
    if (Test-Path $path) {
        Remove-Item -Path $path -Recurse -Force
        Write-Output "Cleared: $path"
    }
}

Write-Output "Teams cache cleanup completed. Please restart Teams."

مدیریت از طریق Teams Admin Center

مرکز مدیریت Teams (از طریق admin.teams.microsoft.com) امکانات گسترده‌ای برای مدیریت و عیب‌یابی فراهم می‌کنه. بخش‌های مهمش اینان:

  • Manage Users: مشاهده وضعیت Teams هر کاربر و سیاست‌های اعمال‌شده.
  • Teams & Channels: مدیریت تیم‌ها و کانال‌ها، تغییر تنظیمات.
  • Meetings: پیکربندی سیاست‌های جلسات، تنظیمات صدا و تصویر.
  • Messaging Policies: کنترل قابلیت‌های چت و پیام‌رسانی.
  • Analytics & Reports: گزارش‌های کیفیت تماس (Call Quality Dashboard) و استفاده از سرویس.

عیب‌یابی با PowerShell

# نصب ماژول Microsoft Teams PowerShell
Install-Module MicrosoftTeams -Scope CurrentUser

# اتصال به Teams
Connect-MicrosoftTeams

# بررسی وضعیت Teams یک کاربر
Get-CsOnlineUser -Identity "[email protected]" |
    Select-Object DisplayName, UserPrincipalName, TeamsUpgradeEffectiveMode,
    EnterpriseVoiceEnabled, HostedVoicemailPolicy |
    Format-List

# بررسی سیاست‌های جلسه اعمال‌شده روی کاربر
Get-CsOnlineUser -Identity "[email protected]" |
    Select-Object TeamsMeetingPolicy, TeamsCallingPolicy, TeamsMessagingPolicy

# تخصیص سیاست جلسه به کاربر
Grant-CsTeamsMeetingPolicy -Identity "[email protected]" -PolicyName "AllowAll"

# لیست تمام تیم‌های سازمان
Get-Team | Select-Object DisplayName, GroupId, Visibility, Archived | Format-Table -AutoSize

# بررسی عضویت یک کاربر در تیم‌ها
Get-Team -User "[email protected]" | Select-Object DisplayName, GroupId

# بررسی اعضای یک تیم خاص
Get-TeamUser -GroupId "group-id-here" | Select-Object Name, User, Role | Format-Table -AutoSize

# بررسی کیفیت تماس‌ها (Call Quality)
# این اطلاعات از طریق Call Quality Dashboard در Teams Admin Center بهتر قابل بررسی است
# اما برای گزارش‌گیری می‌توانید از Graph API استفاده کنید

رفع مشکلات صدا و تصویر

مشکلات کیفیت صدا و تصویر تو جلسات Teams از جمله رایج‌ترین شکایات کاربرانه. برای رفع این مشکلات، این موارد رو بررسی کنید:

  1. پهنای باند اینترنت: Teams حداقل ۱.۵ مگابیت بر ثانیه برای تماس ویدیویی نیاز داره. برای جلسات گروهی با کیفیت بالا، ۴ مگابیت پیشنهاد می‌شه.
  2. تنظیمات دستگاه‌ها: تو Teams به Settings > Devices برید و مطمئن بشید دستگاه صحیح انتخاب شده.
  3. درایورها: مطمئن بشید درایورهای صوتی و تصویری به‌روز هستن.
  4. VPN: اگه کاربر از VPN استفاده می‌کنه، ممکنه Split Tunneling برای Teams لازم باشه تا ترافیک صدا و تصویر مستقیماً ارسال بشه. این یکی از اون مواردیه که خیلی‌ها فراموشش می‌کنن.
  5. Call Quality Dashboard: تو Teams Admin Center بخش Analytics & Reports > Call Quality Dashboard رو بررسی کنید تا مشکلات شبکه‌ای رو شناسایی کنید.

مدیریت OneDrive و SharePoint Online

OneDrive for Business و SharePoint Online دو سرویس ذخیره‌سازی و همکاری هستن که مشکلاتشون می‌تونه کار کاربران رو به شدت مختل کنه. بیاید مهم‌ترین مشکلات و راه‌حل‌ها رو بررسی کنیم.

مشکلات همگام‌سازی OneDrive

مشکلات Sync رایج‌ترین مشکل OneDrive هستن. علائمش شامل آیکون‌های عجیب روی فایل‌ها، فایل‌های گم‌شده یا خطاهای همگام‌سازیه.

  • آیکون‌های ابر روی فایل‌ها: نشون‌دهنده Files On-Demand هستن. فایل‌ها تا وقتی باز نشن دانلود نمی‌شن. اگه کاربر نیاز داره فایل‌ها همیشه در دسترس باشن، روی فایل راست‌کلیک کنه و "Always keep on this device" رو انتخاب کنه.
  • فایل‌های گم‌شده: اول سطل بازیافت OneDrive آنلاین (از طریق مرورگر) رو بررسی کنید. فایل‌های حذف‌شده تا ۹۳ روز قابل بازیابی هستن.
  • خطاهای مداوم همگام‌سازی: ریست کردن کلاینت OneDrive معمولاً مشکل رو حل می‌کنه.
# بازنشانی کلاینت OneDrive
# روش اول: از طریق خط فرمان
%localappdata%\Microsoft\OneDrive\onedrive.exe /reset

# اگر دستور بالا کار نکرد، این مسیر را امتحان کنید:
"C:\Program Files\Microsoft OneDrive\onedrive.exe" /reset

# اگر OneDrive بعد از بازنشانی خودکار شروع نشد:
%localappdata%\Microsoft\OneDrive\onedrive.exe

# بررسی نسخه OneDrive نصب‌شده (PowerShell)
Get-ItemProperty "HKCU:\Software\Microsoft\OneDrive" | Select-Object Version

# بررسی وضعیت همگام‌سازی OneDrive
# از طریق آیکون OneDrive در System Tray
# یا با بررسی فایل لاگ:
Get-Content "$env:LOCALAPPDATA\Microsoft\OneDrive\logs\Business1\SyncDiagnostics.log" -Tail 50

مدیریت فضای ذخیره‌سازی

مدیریت Storage Quota از وظایف مهم مدیریت SharePoint و OneDrive هست. هر کاربر به صورت پیش‌فرض ۱ ترابایت فضای OneDrive داره، ولی این مقدار قابل تغییره.

# اتصال به SharePoint Online PowerShell
Connect-SPOService -Url "https://company-admin.sharepoint.com"

# مشاهده تمام سایت‌های SharePoint
Get-SPOSite -Limit All |
    Select-Object Title, Url, StorageUsageCurrent, StorageQuota, Owner |
    Sort-Object StorageUsageCurrent -Descending |
    Format-Table -AutoSize

# مشاهده اطلاعات یک سایت خاص
Get-SPOSite -Identity "https://company.sharepoint.com/sites/IT" | Format-List

# تغییر کوتای فضای ذخیره‌سازی یک سایت
Set-SPOSite -Identity "https://company.sharepoint.com/sites/IT" -StorageQuota 10240 -StorageQuotaWarningLevel 8192

# مشاهده سایت‌هایی که فضایشان رو به اتمام است
Get-SPOSite -Limit All |
    Where-Object { ($_.StorageUsageCurrent / $_.StorageQuota) -gt 0.8 } |
    Select-Object Title, Url,
    @{N="UsedGB";E={[math]::Round($_.StorageUsageCurrent/1024,2)}},
    @{N="QuotaGB";E={[math]::Round($_.StorageQuota/1024,2)}},
    @{N="UsagePercent";E={[math]::Round(($_.StorageUsageCurrent/$_.StorageQuota)*100,1)}} |
    Format-Table -AutoSize

# تغییر کوتای پیش‌فرض OneDrive for Business
Set-SPOTenant -OneDriveStorageQuota 5242880  # 5 ترابایت به مگابایت

# مشاهده سایت OneDrive یک کاربر
Get-SPOSite -IncludePersonalSite $true -Limit All -Filter "Url -like '-my.sharepoint.com/personal/'" |
    Select-Object Title, Url, StorageUsageCurrent, Owner |
    Format-Table -AutoSize

مدیریت اشتراک‌گذاری و دسترسی‌ها

مشکلات دسترسی از رایج‌ترین تیکت‌های مربوط به SharePoint هستن. کاربر به سایت یا فایل دسترسی نداره، یا بالعکس، اشتراک‌گذاری خارجی ناخواسته فعال شده. هر دو سناریو می‌تونن دردسرساز باشن.

# بررسی تنظیمات اشتراک‌گذاری سطح Tenant
Get-SPOTenant | Select-Object SharingCapability, DefaultSharingLinkType,
    ExternalUserExpirationRequired, ExternalUserExpireInDays

# تغییر تنظیمات اشتراک‌گذاری یک سایت خاص
Set-SPOSite -Identity "https://company.sharepoint.com/sites/HR" -SharingCapability Disabled

# گزینه‌های SharingCapability:
# Disabled - هیچ اشتراک‌گذاری خارجی
# ExistingExternalUserSharingOnly - فقط کاربران خارجی موجود
# ExternalUserSharingOnly - کاربران خارجی با احراز هویت
# ExternalUserAndGuestSharing - همه (شامل لینک‌های ناشناس)

# بررسی دسترسی‌های یک سایت
Get-SPOSiteGroup -Site "https://company.sharepoint.com/sites/IT" |
    Select-Object LoginName, Title, Roles |
    Format-Table -AutoSize

ابزارهای عیب‌یابی مایکروسافت

مایکروسافت مجموعه‌ای از ابزارهای رایگان و قدرتمند برای عیب‌یابی سرویس‌هاش ارائه داده. آشنایی با این ابزارها سرعت تشخیص و رفع مشکلات رو به شکل چشمگیری بالا می‌بره.

Microsoft Support and Recovery Assistant (SaRA)

SaRA یه ابزار رایگانه که خودکار بسیاری از مشکلات رایج Microsoft 365 رو تشخیص و رفع می‌کنه. از آدرس aka.ms/SaRA می‌تونید دانلودش کنید. سناریوهایی که پشتیبانی می‌کنه:

  • مشکلات Outlook (اتصال، پروفایل، Calendar)
  • مشکلات Teams (ورود، عملکرد)
  • مشکلات OneDrive (همگام‌سازی)
  • مشکلات Office Activation
  • مشکلات Exchange Online (ایمیل)

یه نکته: می‌تونید لینک SaRA رو به خود کاربران بدید تا عیب‌یابی اولیه رو انجام بدن. این کار هم وقت شما رو آزاد می‌کنه و هم کاربر حس می‌کنه خودش تونسته مشکل رو حل کنه.

Service Health Dashboard

همون‌طور که قبلاً گفتم، Service Health Dashboard تو admin.microsoft.com > Health > Service health اولین ابزار بررسی هنگام مواجهه با مشکلات گسترده‌ست. علاوه بر بررسی دستی، از طریق Microsoft Graph API هم می‌تونید وضعیت سرویس‌ها رو برنامه‌نویسی بررسی کنید:

# بررسی وضعیت سرویس‌ها از طریق Microsoft Graph PowerShell
Connect-MgGraph -Scopes "ServiceHealth.Read.All"

# دریافت وضعیت فعلی سرویس‌ها
Get-MgServiceAnnouncementHealthOverview |
    Select-Object Service, Status |
    Format-Table -AutoSize

# دریافت حوادث فعال
Get-MgServiceAnnouncementIssue -Filter "isResolved eq false" |
    Select-Object Title, Service, Status, StartDateTime |
    Format-Table -AutoSize

# دریافت جزئیات یک حادثه خاص
Get-MgServiceAnnouncementIssue -ServiceHealthIssueId "issue-id" | Format-List

Microsoft 365 Network Connectivity Test

ابزار تست اتصال شبکه (از connectivity.office.com) یه ارزیابی جامع از کیفیت اتصال شبکه کاربر به سرویس‌های Microsoft 365 ارائه می‌ده. این ابزار موارد زیر رو بررسی می‌کنه:

  • سرعت و تأخیر (Latency) اتصال به سرورهای مایکروسافت
  • مسیریابی DNS و بهینه بودن اون
  • عملکرد شبکه برای Exchange Online، SharePoint Online و Teams
  • مقایسه عملکرد با استانداردهای پیشنهادی مایکروسافت

Remote Connectivity Analyzer

ابزار تحلیل اتصال از راه دور تو آدرس testconnectivity.microsoft.com برای تست اتصال از بیرون سازمان به سرویس‌های Microsoft 365 استفاده می‌شه. مخصوصاً برای تست‌های زیر مفیده:

  • تست Autodiscover برای Outlook
  • تست اتصال Exchange ActiveSync
  • تست جریان ایمیل ورودی و خروجی
  • تست پیکربندی DNS برای ایمیل (MX, SPF, DKIM, DMARC)

امنیت و رعایت انطباق

امنیت تو Microsoft 365 یه لایه حیاتیه که تیم هلپ دسک باید با جنبه‌های اصلیش آشنا باشه. صادقانه بگم، امنیت اون حوزه‌ایه که هر روز اهمیتش بیشتر می‌شه و نمی‌شه ازش غافل شد.

Microsoft Defender for Office 365

Microsoft Defender for Office 365 (که قبلاً Office 365 ATP بود) محافظت پیشرفته‌ای در برابر تهدیدات ایمیلی مثل فیشینگ، بدافزار و حملات BEC ارائه می‌ده. چیزایی که باید بدونید:

  • Safe Attachments: پیوست‌های ایمیل رو تو یه محیط ایزوله (Sandbox) بررسی می‌کنه. اگه کاربر شکایت داره که پیوست‌هاش با تأخیر می‌رسن، ممکنه به خاطر اسکن Safe Attachments باشه.
  • Safe Links: لینک‌های درون ایمیل رو بررسی و بازنویسی می‌کنه. اگه کاربر می‌گه لینک‌ها عجیب به نظر می‌رسن، احتمالاً Safe Links فعاله و این یه چیز خوبه!
  • Quarantine: ایمیل‌های مشکوک ممکنه قرنطینه بشن. کاربران و ادمین‌ها از طریق security.microsoft.com > Review > Quarantine می‌تونن بررسی و آزادشون کنن.

تنظیم احراز هویت چندعاملی (MFA)

MFA یکی از مهم‌ترین اقدامات امنیتیه. طبق آمار مایکروسافت، MFA می‌تونه بیش از ۹۹.۹٪ حملات مبتنی بر هویت رو مسدود کنه. این عدد واقعاً چشمگیره.

# بررسی وضعیت MFA کاربران از طریق Microsoft Graph
Connect-MgGraph -Scopes "UserAuthenticationMethod.Read.All", "User.Read.All"

# بررسی روش‌های احراز هویت ثبت‌شده یک کاربر
Get-MgUserAuthenticationMethod -UserId "[email protected]" |
    Select-Object Id, @{N="MethodType";E={$_.AdditionalProperties["@odata.type"]}}

# گزارش کاربرانی که MFA ثبت‌نام نکرده‌اند
# این اطلاعات از طریق Microsoft Entra Admin Center بهتر قابل مشاهده است
# مسیر: Microsoft Entra admin center > Protection > Authentication methods > Activity

# بررسی Security Defaults (MFA پیش‌فرض)
# از Microsoft Entra admin center > Properties > Manage Security Defaults

# بازنشانی MFA یک کاربر (حذف روش‌های ثبت‌شده)
# توجه: این کار باعث می‌شود کاربر مجبور شود دوباره MFA را ثبت‌نام کند
$methods = Get-MgUserAuthenticationPhoneMethod -UserId "[email protected]"
foreach ($method in $methods) {
    Remove-MgUserAuthenticationPhoneMethod -UserId "[email protected]" -PhoneAuthenticationMethodId $method.Id
}

سیاست‌های دسترسی شرطی (Conditional Access)

Conditional Access Policies امکان کنترل دقیق دسترسی کاربران بر اساس شرایط مختلف (موقعیت مکانی، نوع دستگاه، ریسک ورود و...) رو فراهم می‌کنن. وقتی کاربری شکایت داره که نمی‌تونه وارد بشه، یکی از اولین چیزایی که باید بررسی کنید Conditional Access هست.

# بررسی سیاست‌های Conditional Access
Connect-MgGraph -Scopes "Policy.Read.All"

Get-MgIdentityConditionalAccessPolicy |
    Select-Object DisplayName, State,
    @{N="GrantControls";E={$_.GrantControls.BuiltInControls -join ", "}},
    CreatedDateTime |
    Format-Table -AutoSize

# بررسی جزئیات یک سیاست خاص
Get-MgIdentityConditionalAccessPolicy -ConditionalAccessPolicyId "policy-id" | Format-List

بررسی لاگ‌های ورود در Microsoft Entra ID

Microsoft Entra ID (که قبلاً Azure Active Directory بود) تمام فعالیت‌های ورود رو ثبت می‌کنه. بررسی این لاگ‌ها برای تشخیص مشکلات ورود و شناسایی فعالیت‌های مشکوک خیلی مفیده.

# بررسی لاگ‌های ورود یک کاربر
Connect-MgGraph -Scopes "AuditLog.Read.All", "Directory.Read.All"

Get-MgAuditLogSignIn -Filter "userPrincipalName eq '[email protected]'" -Top 20 |
    Select-Object CreatedDateTime, UserPrincipalName, AppDisplayName,
    @{N="Status";E={$_.Status.ErrorCode}},
    @{N="FailureReason";E={$_.Status.FailureReason}},
    IPAddress,
    @{N="City";E={$_.Location.City}},
    @{N="Country";E={$_.Location.CountryOrRegion}},
    ConditionalAccessStatus |
    Format-Table -AutoSize

# فیلتر کردن ورودهای ناموفق
Get-MgAuditLogSignIn -Filter "userPrincipalName eq '[email protected]' and status/errorCode ne 0" -Top 20 |
    Select-Object CreatedDateTime,
    @{N="ErrorCode";E={$_.Status.ErrorCode}},
    @{N="FailureReason";E={$_.Status.FailureReason}},
    IPAddress, AppDisplayName |
    Format-List

# بررسی ورودهای مشکوک (از IP‌های غیرمعمول)
Get-MgAuditLogSignIn -Filter "riskState eq 'atRisk'" -Top 50 |
    Select-Object CreatedDateTime, UserPrincipalName, IPAddress,
    RiskLevelDuringSignIn, RiskState |
    Format-Table -AutoSize

کدهای خطای رایج ورود و معنای اون‌ها:

  • 50126: رمز عبور نادرست
  • 50053: حساب قفل شده (Account Locked)
  • 50057: حساب غیرفعال شده
  • 50074: نیاز به MFA ولی کاربر تکمیلش نکرده
  • 50076: MFA الزامیه
  • 53003: دسترسی توسط Conditional Access مسدود شده
  • 530003: دستگاه با سیاست‌های Compliance سازگار نیست
  • 700016: اپلیکیشن تو Tenant پیدا نشد

این لیست رو یه جایی ذخیره کنید — خیلی بهتون کمک می‌کنه.

اتوماسیون با PowerShell

اتوماسیون وظایف تکراری با PowerShell یکی از بهترین راه‌ها برای افزایش بهره‌وری تیم هلپ دسکه. با نوشتن اسکریپت‌های کاربردی، کارایی که قبلاً ساعت‌ها وقت می‌گرفتن رو می‌تونید تو چند ثانیه انجام بدید. و صادقانه، این همون چیزیه که یه تکنسین خوب رو از یه تکنسین عالی متمایز می‌کنه.

نصب و پیکربندی Microsoft Graph PowerShell SDK

# نصب Microsoft Graph PowerShell SDK
Install-Module Microsoft.Graph -Scope CurrentUser -Force

# بروزرسانی به آخرین نسخه
Update-Module Microsoft.Graph

# نصب ماژول‌های خاص (حجم کمتر)
Install-Module Microsoft.Graph.Users -Scope CurrentUser
Install-Module Microsoft.Graph.Groups -Scope CurrentUser
Install-Module Microsoft.Graph.Identity.SignIns -Scope CurrentUser
Install-Module Microsoft.Graph.Reports -Scope CurrentUser

# اتصال با حداقل دسترسی‌های مورد نیاز
Connect-MgGraph -Scopes @(
    "User.ReadWrite.All",
    "Group.ReadWrite.All",
    "Directory.ReadWrite.All",
    "AuditLog.Read.All",
    "ServiceHealth.Read.All"
)

# بررسی وضعیت اتصال
Get-MgContext | Select-Object Account, TenantId, Scopes

# قطع اتصال
Disconnect-MgGraph

اسکریپت‌های کاربردی برای هلپ دسک

خب، بیاید چندتا اسکریپت کاربردی رو ببینیم که تو کار روزانه خیلی به دردتون می‌خورن.

اسکریپت ۱: گزارش جامع از یک کاربر

این اسکریپت رو من تقریباً هر روز استفاده می‌کنم. وقتی یه تیکت جدید می‌رسه، اولین کار اینه که یه نمای کلی از وضعیت کاربر بگیرم:

# اسکریپت بررسی جامع وضعیت کاربر - مفید برای تشخیص سریع مشکلات
param(
    [Parameter(Mandatory=$true)]
    [string]$UserEmail
)

Connect-MgGraph -Scopes "User.Read.All", "AuditLog.Read.All", "UserAuthenticationMethod.Read.All"

Write-Output "========================================="
Write-Output "  User Diagnostic Report"
Write-Output "  User: $UserEmail"
Write-Output "  Date: $(Get-Date)"
Write-Output "========================================="

# اطلاعات پایه کاربر
Write-Output "`n--- Basic User Info ---"
$user = Get-MgUser -UserId $UserEmail -Property DisplayName, UserPrincipalName, AccountEnabled,
    Department, JobTitle, LastPasswordChangeDateTime, CreatedDateTime
$user | Format-List DisplayName, UserPrincipalName, AccountEnabled, Department, JobTitle,
    LastPasswordChangeDateTime, CreatedDateTime

# لایسنس‌های کاربر
Write-Output "`n--- Assigned Licenses ---"
Get-MgUserLicenseDetail -UserId $UserEmail |
    Select-Object SkuPartNumber, SkuId |
    Format-Table -AutoSize

# آخرین ورودهای کاربر
Write-Output "`n--- Recent Sign-ins (Last 10) ---"
Get-MgAuditLogSignIn -Filter "userPrincipalName eq '$UserEmail'" -Top 10 |
    Select-Object CreatedDateTime, AppDisplayName,
    @{N="Status";E={if($_.Status.ErrorCode -eq 0){"Success"}else{"Failed: $($_.Status.FailureReason)"}}},
    IPAddress, ConditionalAccessStatus |
    Format-Table -AutoSize

# روش‌های احراز هویت
Write-Output "`n--- Authentication Methods ---"
Get-MgUserAuthenticationMethod -UserId $UserEmail |
    Select-Object @{N="Method";E={$_.AdditionalProperties["@odata.type"].Split(".")[-1]}} |
    Format-Table -AutoSize

# عضویت در گروه‌ها
Write-Output "`n--- Group Memberships ---"
Get-MgUserMemberOf -UserId $UserEmail |
    ForEach-Object { Get-MgGroup -GroupId $_.Id -ErrorAction SilentlyContinue } |
    Select-Object DisplayName, GroupTypes, MailEnabled, SecurityEnabled |
    Format-Table -AutoSize

Write-Output "`n========================================="
Write-Output "  Report Complete"
Write-Output "========================================="

اسکریپت ۲: عملیات دسته‌جمعی روی کاربران

# ایجاد کاربران به صورت دسته‌جمعی از فایل CSV
# فرمت CSV: DisplayName,UserPrincipalName,Department,JobTitle,LicenseSku

param(
    [Parameter(Mandatory=$true)]
    [string]$CsvPath
)

Connect-MgGraph -Scopes "User.ReadWrite.All"

$users = Import-Csv -Path $CsvPath
$results = @()

foreach ($user in $users) {
    try {
        $passwordProfile = @{
            Password = "Welcome@" + (Get-Random -Minimum 1000 -Maximum 9999)
            ForceChangePasswordNextSignIn = $true
        }

        $newUser = New-MgUser -DisplayName $user.DisplayName `
            -UserPrincipalName $user.UserPrincipalName `
            -MailNickname ($user.UserPrincipalName.Split("@")[0]) `
            -PasswordProfile $passwordProfile `
            -AccountEnabled:$true `
            -Department $user.Department `
            -JobTitle $user.JobTitle `
            -UsageLocation "IR"

        # تخصیص لایسنس در صورت مشخص شدن
        if ($user.LicenseSku) {
            $sku = Get-MgSubscribedSku | Where-Object { $_.SkuPartNumber -eq $user.LicenseSku }
            if ($sku) {
                $licenseParams = @{
                    AddLicenses = @(@{SkuId = $sku.SkuId})
                    RemoveLicenses = @()
                }
                Set-MgUserLicense -UserId $newUser.Id -BodyParameter $licenseParams
            }
        }

        $results += [PSCustomObject]@{
            User = $user.UserPrincipalName
            Status = "Created"
            TempPassword = $passwordProfile.Password
        }
        Write-Output "Created: $($user.UserPrincipalName)"
    }
    catch {
        $results += [PSCustomObject]@{
            User = $user.UserPrincipalName
            Status = "Failed: $($_.Exception.Message)"
            TempPassword = "N/A"
        }
        Write-Warning "Failed to create: $($user.UserPrincipalName) - $($_.Exception.Message)"
    }
}

# ذخیره نتایج
$results | Export-Csv -Path "BulkUserCreation_Results_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation
$results | Format-Table -AutoSize

اسکریپت ۳: گزارش لایسنس‌ها

# گزارش جامع وضعیت لایسنس‌ها
Connect-MgGraph -Scopes "Organization.Read.All", "Directory.Read.All"

Write-Output "========================================="
Write-Output "  Microsoft 365 License Report"
Write-Output "  Date: $(Get-Date)"
Write-Output "========================================="

$skus = Get-MgSubscribedSku

foreach ($sku in $skus) {
    $total = $sku.PrepaidUnits.Enabled
    $consumed = $sku.ConsumedUnits
    $available = $total - $consumed
    $usagePercent = if ($total -gt 0) { [math]::Round(($consumed / $total) * 100, 1) } else { 0 }

    # تعیین سطح هشدار
    $alertLevel = switch ($true) {
        ($usagePercent -ge 95) { "[CRITICAL]" }
        ($usagePercent -ge 80) { "[WARNING]" }
        default { "[OK]" }
    }

    Write-Output "`n$alertLevel $($sku.SkuPartNumber)"
    Write-Output "  Total: $total | Used: $consumed | Available: $available | Usage: $usagePercent%"
}

Write-Output "`n========================================="

# صدور گزارش به CSV
$skus | Select-Object SkuPartNumber,
    @{N="Total";E={$_.PrepaidUnits.Enabled}},
    @{N="Consumed";E={$_.ConsumedUnits}},
    @{N="Available";E={$_.PrepaidUnits.Enabled - $_.ConsumedUnits}},
    @{N="UsagePercent";E={
        if($_.PrepaidUnits.Enabled -gt 0){
            [math]::Round(($_.ConsumedUnits/$_.PrepaidUnits.Enabled)*100,1)
        } else {0}
    }} |
    Export-Csv -Path "LicenseReport_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation

Write-Output "`nReport exported to CSV file."

اسکریپت ۴: بررسی و بازنشانی حساب قفل‌شده

# اسکریپت بررسی و رفع مشکلات ورود کاربر
param(
    [Parameter(Mandatory=$true)]
    [string]$UserEmail
)

Connect-MgGraph -Scopes "User.ReadWrite.All", "AuditLog.Read.All"

$user = Get-MgUser -UserId $UserEmail -Property DisplayName, AccountEnabled, UserPrincipalName

Write-Output "Checking user: $($user.DisplayName) ($UserEmail)"
Write-Output "Account Enabled: $($user.AccountEnabled)"

# بررسی آخرین تلاش‌های ورود ناموفق
Write-Output "`n--- Failed Sign-in Attempts (Last 24 hours) ---"
$failedSignIns = Get-MgAuditLogSignIn -Filter "userPrincipalName eq '$UserEmail' and status/errorCode ne 0 and createdDateTime ge $((Get-Date).AddDays(-1).ToString('yyyy-MM-ddTHH:mm:ssZ'))" -All

if ($failedSignIns) {
    $failedSignIns | Select-Object CreatedDateTime,
        @{N="Error";E={$_.Status.ErrorCode}},
        @{N="Reason";E={$_.Status.FailureReason}},
        IPAddress |
        Format-Table -AutoSize

    Write-Output "Total failed attempts: $($failedSignIns.Count)"

    # بررسی IP‌های مشکوک
    $uniqueIPs = $failedSignIns | Group-Object IPAddress | Sort-Object Count -Descending
    Write-Output "`nFailed attempts by IP:"
    $uniqueIPs | Select-Object @{N="IP";E={$_.Name}}, Count | Format-Table -AutoSize
}
else {
    Write-Output "No failed sign-in attempts found."
}

# فعال کردن حساب در صورت غیرفعال بودن
if (-not $user.AccountEnabled) {
    $response = Read-Host "Account is disabled. Do you want to enable it? (Y/N)"
    if ($response -eq "Y") {
        Update-MgUser -UserId $UserEmail -AccountEnabled:$true
        Write-Output "Account has been enabled."
    }
}

# بازنشانی رمز عبور
$resetPassword = Read-Host "Do you want to reset the password? (Y/N)"
if ($resetPassword -eq "Y") {
    $newTempPassword = "Reset@" + (Get-Random -Minimum 10000 -Maximum 99999)
    $passwordProfile = @{
        Password = $newTempPassword
        ForceChangePasswordNextSignIn = $true
    }
    Update-MgUser -UserId $UserEmail -PasswordProfile $passwordProfile
    Write-Output "Password has been reset. Temporary password: $newTempPassword"
    Write-Output "User will be required to change password at next sign-in."
}

بهترین شیوه‌ها برای تیم هلپ دسک

مدیریت مؤثر Microsoft 365 فقط به دانش فنی محدود نمی‌شه. رعایت بهترین شیوه‌ها تو فرآیندهای کاری می‌تونه کیفیت خدمات پشتیبانی رو به طور چشمگیری ارتقا بده.

مستندسازی و نگهداری پایگاه دانش

مستندسازی یکی از اون عادت‌هاییه که خیلی‌ها دوست ندارن ولی تأثیرش فوق‌العاده‌ست. هر مشکل جدیدی که حل می‌کنید، می‌تونه به یه مقاله پایگاه دانش تبدیل بشه.

  • ثبت راه‌حل‌ها: هر بار که مشکل جدیدی رو حل می‌کنید، راه‌حل رو مستند کنید. علائم، مراحل عیب‌یابی و راه‌حل نهایی رو بنویسید.
  • بروزرسانی مستندات: با تغییر سرویس‌ها و رابط کاربری، مستندات قدیمی رو بروزرسانی کنید. مستندات قدیمی می‌تونن گمراه‌کننده باشن.
  • استانداردسازی فرآیندها: برای هر نوع درخواست رایج (مثل ایجاد کاربر، تخصیص لایسنس، بازنشانی رمز عبور) یه SOP داشته باشید.
  • اشتراک‌گذاری دانش: جلسات هفتگی یا ماهانه برگزار کنید تا اعضای تیم تجربیات و راه‌حل‌های جدید رو با هم به اشتراک بذارن.

فرآیندهای Escalation

داشتن یه فرآیند Escalation مشخص و شفاف برای هر تیم هلپ دسک ضروریه. این فرآیند باید شامل موارد زیر باشه:

  1. تعریف سطوح پشتیبانی: مشخص کنید هر سطح (L1, L2, L3) چه وظایف و اختیاراتی داره.
  2. معیارهای Escalation: دقیقاً تعریف کنید چه زمانی باید تیکت Escalate بشه. مثلاً: مشکل بیش از ۳۰ دقیقه حل نشده، بیش از ۵ کاربر تحت تأثیر هستن، یا نیاز به دسترسی admin هست.
  3. اطلاعات مورد نیاز: مشخص کنید هنگام Escalation چه اطلاعاتی باید جمع‌آوری و ارسال بشه.
  4. مسیرهای ارتباطی: مشخص کنید تو ساعات غیراداری چجوری Escalation انجام می‌شه.
  5. زمان‌های پاسخ‌دهی: SLA مشخصی برای هر سطح Severity تعریف کنید.

نظارت و هشدارهای پیشگیرانه

بهتره مشکلات رو قبل از اینکه کاربران متوجه بشن شناسایی و رفع کنید. این رویکرد پیشگیرانه اعتماد کاربران به تیم IT رو واقعاً بالا می‌بره.

  • هشدارهای Service Health: تو Admin Center بخش Health > Service health، هشدارهای ایمیلی رو فعال کنید.
  • نظارت بر لایسنس‌ها: هشدار تو آستانه‌های ۸۰٪ و ۹۵٪ تنظیم کنید.
  • لاگ‌های امنیتی: منظم لاگ‌های ورود مشکوک رو بررسی کنید. ورود از کشورهای غیرمعمول و تلاش‌های ورود ناموفق متعدد باید بررسی بشن.
  • نظارت بر عملکرد: از ابزارهای گزارش‌دهی Microsoft 365 برای شناسایی ناهنجاری‌ها استفاده کنید.
# اسکریپت نظارت پیشگیرانه - اجرای روزانه با Task Scheduler
Connect-MgGraph -Scopes "ServiceHealth.Read.All", "Organization.Read.All", "AuditLog.Read.All"

$report = @()

# 1. بررسی وضعیت سرویس‌ها
$healthIssues = Get-MgServiceAnnouncementIssue -Filter "isResolved eq false"
if ($healthIssues) {
    foreach ($issue in $healthIssues) {
        $report += "SERVICE ISSUE: $($issue.Title) - Service: $($issue.Service) - Status: $($issue.Status)"
    }
}

# 2. بررسی لایسنس‌ها
$skus = Get-MgSubscribedSku
foreach ($sku in $skus) {
    $total = $sku.PrepaidUnits.Enabled
    $consumed = $sku.ConsumedUnits
    if ($total -gt 0) {
        $usagePercent = ($consumed / $total) * 100
        if ($usagePercent -ge 80) {
            $report += "LICENSE WARNING: $($sku.SkuPartNumber) - Usage: $([math]::Round($usagePercent,1))% ($consumed/$total)"
        }
    }
}

# 3. بررسی ورودهای مشکوک (ورود از خارج از کشور)
$riskySignIns = Get-MgAuditLogSignIn -Filter "riskLevelDuringSignIn ne 'none' and createdDateTime ge $((Get-Date).AddDays(-1).ToString('yyyy-MM-ddTHH:mm:ssZ'))" -Top 50

if ($riskySignIns) {
    $report += "SECURITY ALERT: $($riskySignIns.Count) risky sign-in(s) detected in last 24 hours"
    foreach ($signIn in $riskySignIns | Select-Object -First 5) {
        $report += "  - User: $($signIn.UserPrincipalName) | Risk: $($signIn.RiskLevelDuringSignIn) | IP: $($signIn.IPAddress)"
    }
}

# 4. ارسال گزارش
if ($report.Count -gt 0) {
    $emailBody = $report -join "`n"
    Write-Output "=== Daily M365 Monitoring Report ==="
    Write-Output $emailBody

    # می‌توانید از Send-MgUserMail برای ارسال ایمیل خودکار استفاده کنید
}
else {
    Write-Output "All systems normal. No issues detected."
}

Disconnect-MgGraph

آموزش کاربران و فعال‌سازی سلف‌سرویس

یکی از بهترین راه‌ها برای کاهش حجم تیکت‌ها، توانمندسازی کاربران برای حل مشکلات ساده خودشونه. این نه تنها حجم کار تیم هلپ دسک رو کم می‌کنه، بلکه رضایت کاربران رو هم بالا می‌بره. برد-برده!

  • Self-Service Password Reset (SSPR): حتماً بازنشانی رمز عبور سلف‌سرویس رو فعال کنید. این یکی از رایج‌ترین تیکت‌هاست که کاربر خودش می‌تونه انجامش بده. از Microsoft Entra admin center > Protection > Authentication methods > Password reset فعالش کنید.
  • راهنماهای کاربری: راهنماهای ساده و مصور برای مشکلات رایج تهیه کنید. مثلاً: چطوری MFA تنظیم کنیم، چطوری رمز عبور رو عوض کنیم، چطوری از OneDrive استفاده کنیم.
  • پورتال پشتیبانی داخلی: یه پورتال با مقالات FAQ بسازید تا کاربران قبل از ارسال تیکت بتونن خودشون جواب سؤالاتشون رو پیدا کنن.
  • جلسات آموزشی منظم: جلسات کوتاه ۱۵ تا ۳۰ دقیقه‌ای برای معرفی قابلیت‌های جدید یا آموزش نکات امنیتی برگزار کنید.

چک‌لیست روزانه تیم هلپ دسک

برای اطمینان از مدیریت مؤثر Microsoft 365، این چک‌لیست رو هر روز طی کنید:

  1. بررسی Service Health Dashboard: آیا سرویسی قطع یا دچار مشکل شده؟
  2. بررسی Message Center: آیا تغییر یا بروزرسانی جدیدی تو راهه؟
  3. بررسی تیکت‌های باز: آیا تیکت قدیمی‌ای هست که پیگیری نشده؟
  4. بررسی هشدارهای امنیتی: آیا ورود مشکوک یا هشدار امنیتی جدیدی وجود داره؟
  5. بررسی وضعیت لایسنس‌ها: آیا لایسنسی رو به اتمامه؟
  6. بروزرسانی مستندات: آیا راه‌حل جدیدی مستند شده یا مستند قدیمی نیاز به بروزرسانی داره؟

جمع‌بندی و منابع مفید

مدیریت و عیب‌یابی Microsoft 365 یه مهارت گسترده و همیشه در حال تحوله. مایکروسافت مرتباً قابلیت‌های جدید اضافه می‌کنه و رابط کاربری رو تغییر می‌ده، پس یادگیری مداوم واقعاً یه ضرورته.

نکات کلیدی که باید یادتون بمونه:

  • اول Service Health رو چک کنید: قبل از هر کاری مطمئن بشید مشکل از سمت مایکروسافت نیست. رویداد ژانویه ۲۰۲۶ نشون داد حتی مایکروسافت هم دچار قطعی‌های طولانی می‌شه.
  • PowerShell رو جدی بگیرید: Microsoft Graph PowerShell SDK جایگزین کامل ماژول‌های قدیمی شده. هرچه زودتر باهاش آشنا بشید، بهتره.
  • امنیت اولویت اوله: MFA، Conditional Access و نظارت بر لاگ‌های ورود باید تو صدر اولویت‌ها باشن.
  • مستندسازی فراموش نشه: هر راه‌حلی که پیدا می‌کنید مستند کنید. هم به خودتون و هم به همکاراتون کمک می‌کنه.
  • اتوماسیون کلید بهره‌وریه: وظایف تکراری رو با اسکریپت خودکار کنید تا وقت بیشتری برای مسائل پیچیده‌تر داشته باشید.
  • آماده افزایش قیمت باشید: با توجه به افزایش قیمت لایسنس‌ها از جولای ۲۰۲۶، ممیزی لایسنس‌ها و بهینه‌سازی مصرف رو از همین الان شروع کنید.

منابع مفید برای یادگیری بیشتر:

  • Microsoft Learn: پلتفرم آموزشی رایگان مایکروسافت با دوره‌های جامع Microsoft 365 Administration
  • Microsoft 365 Admin Center Documentation: مستندات رسمی مایکروسافت در learn.microsoft.com
  • Microsoft Tech Community: انجمن فنی مایکروسافت برای بحث و تبادل نظر با دیگر متخصصان
  • Microsoft Graph PowerShell SDK Documentation: مرجع کامل دستورات PowerShell جدید
  • Microsoft 365 Roadmap: نقشه راه محصولات مایکروسافت برای آگاهی از تغییرات آینده

امیدوارم این راهنما برای کار روزانه شما تو تیم هلپ دسک مفید باشه. فراموش نکنید که بهترین تکنسین هلپ دسک کسیه که هم دانش فنی عمیق داره و هم مهارت‌های ارتباطی خوبی با کاربران. موفق باشید!

درباره نویسنده Editorial Team

Our team of expert writers and editors.