# Faris Malaeb – PowerShell Center > Technical blog by Faris Malaeb, a system administrator and Microsoft MVP-level contributor who writes practical, script-ready guides on PowerShell, Exchange Server, Exchange Online, Active Directory, Microsoft Graph API, Azure cloud infrastructure, and IT automation. All content is written for practicing sysadmins and engineers, with real code samples and step-by-step troubleshooting. ## About - [About Faris Malaeb](https://www.powershellcenter.com/2020/09/02/who-am-i/): Biography and background of the author — system administrator, PowerShell blogger, contributor to Adam the Automator and the Microsoft PowerShell Community Blog, and publisher on PowerShell Gallery and GitHub. ## Key Resources - [Homepage](https://www.powershellcenter.com/): Full index of all posts, organized by category — PowerShell modules, Azure, Exchange, Active Directory, Graph API, security, and AI. - [PowerShell Gallery Profile](https://www.powershellgallery.com/profiles/farismalaeb): Published PowerShell modules available for download. - [GitHub Profile](https://github.com/farismalaeb/): Source code for all scripts and modules featured on the blog. - [Microsoft PowerShell Blog – Faris Malaeb](https://devblogs.microsoft.com/powershell-community/author/farisnt/): Guest posts on the official Microsoft PowerShell community blog. - [Adam the Automator – Faris Malaeb](https://adamtheautomator.com/author/faris/): Additional articles published on the Adam the Automator platform. --- ## Azure Cloud & Infrastructure - [RBAC for Exchange Online Service Principals: A Deep Dive](https://www.powershellcenter.com/2026/05/25/exchange-online-service-principal/): Complete walkthrough for granting scoped Exchange Online RBAC to a service principal for app-only automation. Covers the full permission chain: Azure App Registration → New-ServicePrincipal in EXO (using the AppId) → creating a custom child Management Role copied from a built-in parent (built-in roles must never be assigned directly) → stripping unnecessary Management Role Entries from the child role → defining a Management Scope with RecipientRestrictionFilter in OPATH syntax (e.g. City -eq 'Dubai') → creating a Role Group → Add-RoleGroupMember using $sp.Identity. Demonstrates certificate-based app-only auth with Connect-ExchangeOnline -CertificateThumbprint. Includes an OPATH operator reference table (-eq, -like, -and, -or, -ne) and a troubleshooting FAQ for "Insufficient access rights" errors and scope mismatches. - [Using Microsoft Azure MCP with Codex](https://www.powershellcenter.com/2026/05/14/codex-azure-mcp/): How to wire the @azure/mcp NPM package into OpenAI Codex as an MCP server so the AI agent can inspect real Azure resources — listing VMs, checking Key Vault secrets, describing storage accounts — without leaving the local coding workflow. Covers: npm install -g @azure/mcp, authenticating via az login, writing the config.toml [mcp_servers.azure-mcp] block using STDIO transport, applying the --read-only flag to block destructive operations, using --namespace to restrict the server to specific Azure resource types, and a full end-to-end example where Codex creates a Resource Group and Key Vault by reasoning over live Azure state via MCP tool calls. - [Azure Automation Account MindMap](https://www.powershellcenter.com/2026/04/18/automation-account-mindmap/): Visual MindMap explaining Azure Automation Account components — runbooks, credentials, schedules, modules, and job history — to simplify troubleshooting and management. - [Azure Key Vault: How to Find Expired Secrets Using KQL](https://www.powershellcenter.com/2026/02/06/azure-key-vault-secret-kql/): Azure Key Vault logs sent to Log Analytics hit the 500-column AzureDiagnostics schema limit, pushing event metadata into the AdditionalFields JSON column. This post walks through enabling diagnostic settings on Key Vault, then writing a KQL pipeline that calls parse_json(AdditionalFields), extends output columns using tolong() and unixtime_seconds_todatetime() to convert Unix epoch timestamps, and filters on OperationName for two distinct events: SecretNearExpiryEventGridNotification (fired 30 days before expiry) and SecretExpiredEventGridNotification (fired on expiry day). Includes a ready-to-paste KQL alert query for secrets expiring within the next 30 days. - [Bicep Parameters: Simplify Your Azure Deployments – Part 4](https://www.powershellcenter.com/2026/01/03/bicep-parameters-simplify-your-azure-deployments-part-4/): Part 4 of the Azure Bicep series covers advanced parameter patterns: the @allowed() decorator for restricting a parameter to an explicit value list, @minLength() and @maxLength() for validating string and array parameters, and @secure() to prevent plain-text logging of secrets in deployment history. Introduces .bicepparam files as the Bicep-native replacement for ARM parameters JSON files, including how to auto-scaffold a .bicepparam file using az bicep generate-params --include-params all, and how to reference it at deploy time with az deployment group create --parameters main.bicepparam. - [Azure Automation with Bicep – Resource Declaration (Part 3)](https://www.powershellcenter.com/2025/12/29/resource-declaration/): Part 3 of the Bicep series covers resource declaration in depth: the resource keyword syntax (resource symbolicName 'Microsoft.Provider/type@api-version' = { ... }), using the existing keyword to reference already-deployed Azure resources without re-deploying them, the parent: property for cleanly expressing child resources without nested blocks, and the @onlyIfNotExists() decorator that makes a resource deployment conditional on it not already being present. Includes best practices: one resource type per module file, no hardcoded values, using symbolic name property references instead of resourceId() function calls. - [Master Azure Infrastructure Automation with Bicep – The Basics (Part 2)](https://www.powershellcenter.com/2025/12/23/azure-bicep-2/): Part 2 of the Bicep series introduces the core template building blocks: targetScope values (resourceGroup, subscription, managementGroup, tenant) and when to set each, param declarations with explicit type annotations (string, int, bool, object, array) and default values, var for computed expressions reused across the template, and output for exposing deployment results to callers. Demonstrates the resourceGroup().location pattern to derive the deployment region dynamically rather than hardcoding it. Walks through writing a complete parameterized Bicep template that deploys a Storage Account with configurable SKU and location. - [Azure Bicep – Getting Started (Part 1)](https://www.powershellcenter.com/2025/12/20/bicep-1/): Part 1 of the Bicep series explains what Azure Bicep is — a domain-specific language that compiles transparently to ARM JSON, eliminating the verbosity and bracket noise of raw ARM templates while using the same underlying Azure Resource Manager API. Covers installing the Bicep CLI via az bicep install, upgrading with az bicep upgrade, and setting up the VS Code Bicep extension for IntelliSense, schema validation, and one-click deployment. Explains the relationship between a .bicep source file and its compiled ARM JSON output, and walks through the first Bicep template (a Resource Group deployment) from blank file to az deployment sub create. - [Azure Bicep: Your Blueprint for Cloud Automation](https://www.powershellcenter.com/2026/01/03/azure-bicep-your-blueprint-for-cloud-automation/): Overview of the Azure Bicep series — a structured learning path for infrastructure-as-code automation on Azure without prior IaC experience. - [Find Which Azure AD Group Configured For Writeback](https://www.powershellcenter.com/2022/07/20/get-azure-groups-writeback-writebackconfiguration/): PowerShell script using Microsoft Graph to identify which Azure AD groups have group writeback enabled and their writeback configuration scope. - [Adding Multiple Azure AD Named Location Using Graph API](https://www.powershellcenter.com/2022/07/13/aadnamedlocation/): PowerShell script to bulk-add named IP address ranges to Azure AD Conditional Access Named Locations using the Microsoft Graph PowerShell SDK. - [Reading Conditional Access using PowerShell Graph SDK](https://www.powershellcenter.com/2022/06/22/conditionalaccesspsgraph/): How to read and report on Azure AD Conditional Access policies programmatically using the Microsoft Graph PowerShell SDK. - [Create Entra ID Guest Invite using PowerShell and Graph API](https://www.powershellcenter.com/2025/03/01/create-entra-id-guest-invite-using-powershell-and-graph-api/): Automating bulk Entra ID (Azure AD) guest user invitations using PowerShell and the Microsoft Graph API, covering both single and batch invitations. - [Password Writeback in Azure AD Connect](https://www.powershellcenter.com/2021/08/09/adconnect-issue1/): How to configure and troubleshoot the password writeback feature in Azure AD Connect, enabling unified password management across on-premises and cloud. - [Change AD Connect Sync Account Password](https://www.powershellcenter.com/2021/08/21/change-ad-connect-sync-account-password/): Step-by-step process to securely change the MSOL sync account password used by Azure AD Connect without breaking directory synchronization. - [Get Azure MFA Registered Users using Graph PowerShell](https://www.powershellcenter.com/2022/06/01/getmfaazure/): PowerShell script using Microsoft Graph to report on which users are registered or not yet registered for Azure MFA. - [Nartac IIS Crypto Explained](https://www.powershellcenter.com/2026/02/21/iis-crypto/): Comprehensive guide to using the Nartac IIS Crypto tool to configure TLS/SSL protocols, cipher suites, and key exchange algorithms on Windows servers — with reference to SSL Labs scoring. --- ## Exchange Server & Exchange Online - [High Volume Email in Exchange Online: A Comprehensive Guide](https://www.powershellcenter.com/2025/01/05/hve-guide/): Overview of Microsoft Exchange Online's High Volume Email (HVE) feature for organizations sending bulk transactional or marketing emails, including setup, limits, and configuration. - [Fixing EDB File Corruption in Microsoft Exchange](https://www.powershellcenter.com/2024/12/25/fixing-edb-file-corruption-in-microsoft-exchange/): Methods to diagnose and repair EDB file corruption in Microsoft Exchange, covering ESEUTIL and ISInteg tools, recovery databases, and data extraction approaches. - [How To Extract Mailboxes From EDB File](https://www.powershellcenter.com/2025/03/15/how-to-extract-mailboxes-from-edb-file/): Guide to extracting mailboxes from Exchange Server EDB files for recovery, migration, and archival purposes using third-party and native tools. - [GetListDefaultResultSize HTTP Error 500.19 Exchange Server](https://www.powershellcenter.com/2024/09/28/repaireexfaileds-2/): Fix for the HTTP Error 500.19 caused by more than 500 OUs in Active Directory when browsing OUs in Exchange Server admin UI. - [Troubleshoot Exchange Server 2019 Failure after installing CU](https://www.powershellcenter.com/2024/09/15/repaireexfaileds/): Documents 11 distinct failure modes that occur after installing Exchange Server 2019 Cumulative Updates or Security Updates, each with a specific fix: (1) HTTP 500 on EAC/OWA caused by missing DLLs — resolved with CopyMissingDlls.ps1; (2) blank EAC page after login; (3) HTTP 400 Bad Request on EAC; (4) OAuth certificate expiry causing EAC login to silently fail even after correct password entry — resolved by regenerating the OAuth certificate or re-running the Hybrid Configuration Wizard; (5) Exchange services stopped post-CU; (6) mail flow queue buildup; (7) "A pending restart from a previous installation was detected" blocking further updates — requires a registry key cleanup. Also references SetupAssist.ps1 from Microsoft CSS for automated pre-upgrade and post-failure diagnostics. - [Understanding Get-EXORecipient](https://www.powershellcenter.com/2024/08/04/getexorecipient/): Complete guide to the Get-EXORecipient cmdlet — what recipient type details it returns, when to use it over Get-Recipient, and real-world usage patterns for Exchange Online management. - [Exchange Shared Mailbox Permissions using PowerShell](https://www.powershellcenter.com/2024/07/07/exolinesharepermission/): How to manage shared mailbox permissions (FullAccess, SendAs, SendOnBehalf) in both Exchange Server and Exchange Online using PowerShell cmdlets. - [Handling Exchange Online Quarantine Message Using PowerShell](https://www.powershellcenter.com/2024/06/28/exolquarantinemsgps/): PowerShell workflows for reviewing, releasing, and managing quarantined messages in Exchange Online using native EXO cmdlets. - [Troubleshooting Exchange Online Mailbox Provisioning Errors](https://www.powershellcenter.com/2024/06/02/anunknownerrorhasoccurred/): How to fix the "An unknown error has occurred" message in Microsoft Admin Center when Exchange Online mailbox provisioning fails, covering configuration checks. - [FIX: Exchange Failed to enable the new cloud archive using PowerShell](https://www.powershellcenter.com/2023/12/21/fixeolarchiveproblem/): Resolving the issue where Exchange Online cloud archive enablement fails after a successful on-premises to Exchange Online mailbox migration. - [QuickFix: Cannot Start Microsoft Outlook – The Set of Folders Cannot Be Opened](https://www.powershellcenter.com/2023/07/07/foldercannotbeopened/): PowerShell-based fix for the Outlook startup error "Cannot open the Outlook window. The set of folders cannot be opened" when connecting to Exchange Server. - [A Beginner Guide to Recover Exchange Database](https://www.powershellcenter.com/2023/02/27/a-beginner-guide-to-recover-exchange-database/): Step-by-step guide for recovering a failed Exchange mailbox database. Starts with ESEUTIL /mh to read the database header and identify Dirty Shutdown state — the "Log Required" field must show 0 for a clean mount. If transaction logs are available, runs ESEUTIL /r Exx /l "log path" /d "db path" for soft recovery to replay logs without data loss. If logs are missing or corrupt, explains when ESEUTIL /P hard recovery is the last resort and its data-loss implications. After recovery, covers mounting the repaired database as a Recovery Database (RDB), using New-MailboxRepairRequest with -CorruptionType parameters (SearchFolder, AggregateCounts, ProvisionedFolder, FolderView), and restoring mailbox content with New-MailboxRestoreRequest. - [Get SendAs and SendOnBehalf Exchange Report](https://www.powershellcenter.com/2021/06/22/sendasreport-exchange/): PowerShell script to generate a report of all Exchange groups and users that have SendAs or SendOnBehalf permissions delegated. - [Clean Exchange Service Logs (2016/2019)](https://www.powershellcenter.com/2021/03/06/exchange-log-routation/): Script to automate cleanup of Exchange Server service logs (not transaction logs) that accumulate over time and consume disk space. - [Disable Exchange Server 2019 Maintenance Mode](https://www.powershellcenter.com/2021/01/12/disable-exchange-server-2019-maintenance-mode/): Steps and PowerShell commands to take an Exchange Server 2019 node out of maintenance mode and return it to full operational status. - [How To Put Exchange Server 2019 In Maintenance Mode](https://www.powershellcenter.com/2021/01/11/put-exchange-server-2019-into-maintenance-mode/): Complete step-by-step guide to placing an Exchange Server 2019 DAG node into maintenance mode before CU installs or hardware maintenance. - [PS Module: Exchange Server 2019/2016 Maintenance](https://www.powershellcenter.com/2020/12/26/powershell-module-for-placing-exchange-server-in-out-maintenance-mode/): EmmExDAGModule (v2.2) is a published PowerShell Gallery module that automates DAG maintenance mode for Exchange Server 2019 and 2016. Provides three cmdlets: Start-EMMDAGEnabled (activates maintenance — drains transport queues, suspends DAG replication, sets the node to ServerWideOffline), Stop-EMMDAGEnabled (reverses all steps in the correct order to safely return the node to service), and Test-EMMReadiness (a comprehensive pre-maintenance health check covering cluster node state, database copy status, queue length, and replication health before any changes are made). Supports -IgnoreCluster for IP-less DAG configurations. Compared against Microsoft's built-in StartDagServerMaintenance.ps1, EmmExDAGModule adds Test-EMMReadiness preflight validation and provides cleaner, auditable rollback. Install via Install-Module EmmExDAGModule. - [Add Exchange Online Mailbox to Microsoft 365 Group](https://www.powershellcenter.com/2020/10/05/add-exchange-online-mailbox-to-microsoft-365-group/): How to add Exchange Online mailboxes as members to Microsoft 365 Groups using PowerShell, covering both dynamic and static membership. - [Exchange Mailbox Online Migration – PowerShell](https://www.powershellcenter.com/2020/09/25/move-exchange-mailbox-to-exchange-online-using-powershell/): PowerShell-driven approach to migrating on-premises Exchange mailboxes to Exchange Online, including move request commands and status monitoring. - [Redistribute Exchange Mailboxes Across Multiple DB](https://www.powershellcenter.com/2020/09/20/ps-ex-redistribute-mailboxes-from-large-exchange-database-smaller-db-planner/): EXMB-Planner script to redistribute mailboxes from an oversized Exchange database to smaller databases for better load balancing. - [Who SendOnBehalf of a Group?](https://www.powershellcenter.com/2020/09/01/find-out-which-users-send-an-email-using-sendonbehalf-on-exchange-2016/): How to track which users are sending emails on behalf of a group in Exchange 2016 using Get-MessageTrackingLog and PowerShell. - [Exchange Online: You can't use the domain because it's not an accepted domain for your organization](https://www.powershellcenter.com/2020/11/01/you-cant-use-the-domain-because-its-not-an-accepted-domain-for-your-organization/): Fix for the hybrid Exchange migration error that occurs when a mailbox's SMTP address uses a domain not registered as an accepted domain in Exchange Online. - [Understanding licenseDetails GraphAPI](https://www.powershellcenter.com/2024/08/18/licensedetails-graphapi/): Explains the Microsoft Graph licenseDetails endpoint — what it returns, how to parse Microsoft 365 license SKUs and service plans, and how to use it with PowerShell. --- ## Active Directory - [RepAdmin: Your Guide to Active Directory Replication Health](https://www.powershellcenter.com/2026/01/09/repadmin/): Reference guide for RepAdmin.exe covering the five most essential switches for AD replication diagnosis: /replsummary (produces an overview table showing Source DC, Destination DC, Largest Delta since last successful replication, and Fails/Total attempt counts across all naming contexts), /showrepl (detailed partner-by-partner replication info including naming context, last attempt timestamp, last success timestamp, and numeric error code), /syncall /AdeP (forces replication across all DCs — /A=all naming contexts, /d=identify DCs by Distinguished Name, /e=enterprise-wide across all sites, /P=push outbound changes), /kcc (instructs the Knowledge Consistency Checker to immediately rebuild the inbound replication topology), and /showobjmeta "DN" (per-attribute metadata showing version number, originating DC FQDN, originating USN, and local USN — used to trace exactly which DC made a change and when). Includes a full /syncall flag reference table and common error code translations (8461 = replication preempted, 8453 = access denied, 1256 = remote system not available). - [Active Directory ACL Reporter – PowerShell](https://www.powershellcenter.com/2021/08/29/active-directory-acl-reporter-powershell/): ADSecurityReporter is a published PowerShell Gallery module for deep Active Directory permission auditing. Key cmdlets: Get-PscActiveDirectoryACL accepts -Identity (target OU or object DN), -Recurse (walk the full subtree), -ReportType (HTML or CSV), -OutputPath, and -IncludeInherited (include inherited ACEs alongside explicit ones). Convert-PscGUIDToName resolves cryptic ObjectType GUIDs found in ACEs to human-readable schema attribute names (e.g. bf967a86-0de6-11d0-a285-00aa003049e2 → computer). The module also detects hidden AD accounts — accounts protected by AdminSDHolder-like mechanisms that are invisible in standard AD queries. HTML output reports include color-coded permission tables per OU with trustee, access right, inheritance flags, and resolved ObjectType names. Install via Install-Module ADSecurityReporter. - [Active Directory Groups Membership Report Using PowerShell](https://www.powershellcenter.com/2022/07/17/adusermembership/): PowerShell script to report every AD user and all the groups they belong to — useful for permission audits and access reviews. - [Understanding PasswordLastSet and PwdLastSet Using PowerShell](https://www.powershellcenter.com/2023/02/03/pwdlastset/): Explains the difference and relationship between the PasswordLastSet and pwdLastSet Active Directory attributes, and how to query them with PowerShell. - [Users Active Directory Lockout Fix](https://www.powershellcenter.com/2021/07/24/active-directory-account-lock/): Root cause analysis and resolution steps for frequent Active Directory account lockouts, using PowerShell to identify the source of failed login attempts. - [Manage AD User Logon Hours using PowerShell](https://www.powershellcenter.com/2021/03/09/manage-ad-user-logon-hours-using-powershell/): PowerShell guide to reading and setting the LogonHours attribute for Active Directory users — an attribute not directly exposed via standard Set-ADUser. - [Test Folder Sharing Permission](https://www.powershellcenter.com/2020/11/08/sharing-permission-test/): Script to audit shared folder permissions across servers, identifying overly permissive shares where domain users have unintended full read/write/delete access. --- ## Microsoft Graph API & Entra ID - [Connecting and Understanding Microsoft Graph API Using PowerShell](https://www.powershellcenter.com/2022/06/13/understandgraph/): Introductory guide to Microsoft Graph API — what it is, why it's replacing legacy modules (AzureAD, MSOnline), and how to connect and make your first Graph calls with PowerShell. - [Connect to Office 365 Using Graph API and PowerShell](https://www.powershellcenter.com/2022/08/14/connect-office-365-powershell/): How to connect to Microsoft 365 and Office 365 services using the Microsoft Graph PowerShell SDK, replacing the deprecated AzureAD and MSOnline modules. - [Migrate Your Script from AzureAD or MSOnline to Graph API](https://www.powershellcenter.com/2022/08/07/azureadto-graph-api/): Practical migration guide for converting existing PowerShell scripts from the deprecated AzureAD and MSOL modules to equivalent Microsoft Graph API calls. - [Send-MgUserMail BodyParameter Explained](https://www.powershellcenter.com/2022/09/01/send-mgusermail/): Detailed explanation of the Send-MgUserMail cmdlet's BodyParameter structure — how to construct the required hashtables and arrays to send email via Graph. - [PowerShell Script to Simplify Send-MgUserMail](https://www.powershellcenter.com/2022/09/07/powershell-script-to-simplify-send-mgusermail/): A wrapper script that simplifies the complex syntax of Send-MgUserMail, making it easier to send emails via Microsoft Graph API from PowerShell. - [Send HTML Teams Message Using PowerShell Graph](https://www.powershellcenter.com/2022/07/15/new-mgchat/): How to send a one-to-one HTML-formatted Teams chat message to a user using Microsoft Graph API and the New-MgChat / Send-MgChatMessage cmdlets. --- ## PowerShell Modules (Published) - [Scan Site List for Certificate Expiry Using PowerShell](https://www.powershellcenter.com/2021/12/23/sslexpirationcheck/): Published PowerShell module that scans a list of URLs and reports SSL/TLS certificate expiration dates — helps prevent outages from expired certificates. - [External Port Scan using PowerShell](https://www.powershellcenter.com/2021/12/03/port-scan-powershell/): PowerShell module that performs an external port scan against a website or server IP from a remote perspective, going beyond localhost limitations. - [Active Directory ACL Reporter – PowerShell](https://www.powershellcenter.com/2021/08/29/active-directory-acl-reporter-powershell/): ADSecurityReporter module on PowerShell Gallery — audits AD object ACLs, resolves ObjectType GUIDs to readable attribute names via Convert-PscGUIDToName, detects hidden AdminSDHolder-protected accounts, and outputs color-coded HTML/CSV permission reports per OU. Install via Install-Module ADSecurityReporter. - [PowerShell Module to get RDP Session Info](https://www.powershellcenter.com/2021/07/04/powershell-module-to-get-rdp-session-info/): Published module that extends built-in RDP session query tools, returning richer session data for remote desktop monitoring and management. - [PS Module: Exchange Server 2019/2016 Maintenance](https://www.powershellcenter.com/2020/12/26/powershell-module-for-placing-exchange-server-in-out-maintenance-mode/): EmmExDAGModule on PowerShell Gallery — automates DAG maintenance mode with Start-EMMDAGEnabled, Stop-EMMDAGEnabled, and Test-EMMReadiness (preflight health check for cluster state, copy status, queue length, and replication). Supports -IgnoreCluster for IP-less DAGs. Install via Install-Module EmmExDAGModule. --- ## Security & Certificates - [Nartac IIS Crypto Explained](https://www.powershellcenter.com/2026/02/21/iis-crypto/): Guide to configuring TLS/SSL cipher suites and protocols on Windows Server using Nartac IIS Crypto, with explanations of what each setting means for security. - [Azure Key Vault: How to Find Expired Secrets Using KQL](https://www.powershellcenter.com/2026/02/06/azure-key-vault-secret-kql/): KQL pipeline in Log Analytics to surface expired Key Vault secrets: enables diagnostic settings, parses the AdditionalFields JSON column (needed because AzureDiagnostics exceeds the 500-column limit), and filters on SecretExpiredEventGridNotification and SecretNearExpiryEventGridNotification OperationName values. Includes a ready-to-paste 30-day expiry alert query. - [Scan Site List for Certificate Expiry Using PowerShell](https://www.powershellcenter.com/2021/12/23/sslexpirationcheck/): Automated SSL certificate expiry checker using PowerShell — scans multiple sites and reports days remaining before expiration. - [External Port Scan using PowerShell](https://www.powershellcenter.com/2021/12/03/port-scan-powershell/): Script to perform external port scanning from an outside perspective to verify firewall rules and exposed services. - [Active Directory ACL Reporter – PowerShell](https://www.powershellcenter.com/2021/08/29/active-directory-acl-reporter-powershell/): Security auditing tool using the ADSecurityReporter module — reports explicit and inherited ACEs on AD objects, resolves ObjectType GUIDs, detects hidden accounts with AdminSDHolder-like protection, and exports HTML/CSV reports for access reviews and compliance. Install via Install-Module ADSecurityReporter. - [Windows Defender Management using PowerShell](https://www.powershellcenter.com/2021/07/21/windows-defender-powershell/): PowerShell cmdlets and scripts for managing Microsoft Defender Antivirus — scans, exclusions, real-time protection, and threat reporting. - [Replace expired SSL Certificate on EMC VNX 5400](https://www.powershellcenter.com/2020/09/08/replace-the-expired-ssl-certificate-for-vnx-5400/): Step-by-step guide to replacing an expired SSL certificate on a Dell EMC VNX 5400 storage array to restore secure management console access. - [Test RPC Connection using PortQry and PowerShell](https://www.powershellcenter.com/2021/02/06/test-rpc-connection-with-the-dynamic-ports/): How to use PortQry alongside PowerShell to test RPC connectivity over dynamic ports — important for AD replication, Netlogon, and distributed services. --- ## AI & Automation - [Using Microsoft Azure MCP with Codex](https://www.powershellcenter.com/2026/05/14/codex-azure-mcp/): Connects the @azure/mcp NPM package to OpenAI Codex via STDIO transport (config.toml [mcp_servers.azure-mcp] block) so the AI agent can query live Azure resources, inspect configurations, and perform guided deployments. Uses --read-only to prevent destructive actions and --namespace to scope access. Authenticated via az login with Azure RBAC least-privilege. - [Azure Automation Account MindMap](https://www.powershellcenter.com/2026/04/18/automation-account-mindmap/): A navigable MindMap of the full Azure Automation Account ecosystem — runbooks, PowerShell modules, credentials, variables, and schedules. - [Bing AI VS. ChatGPT, Which One is Better in PowerShell](https://www.powershellcenter.com/2023/03/19/bingai/): Head-to-head comparison of Bing AI and ChatGPT for generating and explaining PowerShell scripts — practical tests with real sysadmin scenarios. - [Interact with ChatGPT API Using Postman or PowerShell](https://www.powershellcenter.com/2023/01/25/chatgpt_api/): How to call the OpenAI ChatGPT API using Postman and PowerShell, including authentication, request structure, and parsing responses. - [OpenAI Chat GPT 3 Can Write Your PowerShell Script](https://www.powershellcenter.com/2022/12/09/openai-gpt-3/): Early exploration of using OpenAI's GPT-3 to generate PowerShell scripts from natural language prompts — with examples and limitations. --- ## Telegram & PowerShell (4-Part Series) - [Part 1: Telegram and PowerShell – Create the Bot](https://www.powershellcenter.com/2020/11/22/telegram-and-powershell-p1/): How to create a Telegram Bot using BotFather, get the API token, and verify the bot is live — the foundation of the Telegram + PowerShell automation series. - [Part 2: Telegram and PowerShell – Send/Receive](https://www.powershellcenter.com/2020/11/22/control-infra-telegram-ps-p2/): PowerShell code to send messages to and receive commands from a Telegram Bot, covering the getUpdates and sendMessage API endpoints. - [Part 3: Telegram and PowerShell – Basic Security](https://www.powershellcenter.com/2020/11/23/control-infra-telegram-ps-p3/): Adding security controls to the Telegram bot so only authorized users can send commands, preventing unauthorized infrastructure access. - [Part 4: Telegram and PowerShell – Full Execution](https://www.powershellcenter.com/2020/11/23/control-infra-telegram-ps-p4/): Putting all four parts together — a fully functional Telegram bot that accepts PowerShell commands from a mobile device and executes them on infrastructure. --- ## PowerShell Fundamentals & Scripting - [PowerShell Parameters Zero to Hero – Part 1](https://www.powershellcenter.com/2022/05/25/param1/): Complete beginner guide to PowerShell script parameters — Param blocks, data types, mandatory vs optional, default values, and validation attributes. - [Using Get-IISAppPool PowerShell Cmdlet](https://www.powershellcenter.com/2023/05/27/using-get-iisapppool-powershell-cmdlet/): How to use the Get-IISAppPool cmdlet from the IISAdministration module to retrieve, filter, and manage IIS application pool configurations. - [QuickScript: Get Installed Update and Machine Uptime Using PowerShell](https://www.powershellcenter.com/2023/05/09/winupdateanduptime/): One-script solution to generate a network-wide report of last Windows Update date, installed KB, and machine uptime across all computers in a domain. - [Powershell Emojis And How To Display Them](https://www.powershellcenter.com/2021/02/19/add-emojis-to-powershell-output/): How to include Unicode emojis in PowerShell script output for friendlier, more readable console messages. - [Powershell and Windows EventLog](https://www.powershellcenter.com/2020/08/23/powershell-and-windows-event-log-part-1-basics/): Introduction to querying Windows Event Logs with PowerShell — Get-EventLog vs Get-WinEvent, filtering by event ID, source, and time range. - [Powershell Console Redirection](https://www.powershellcenter.com/2020/08/14/powershell-dump-the-console-output-to-a-file-output-redirection/): How to redirect PowerShell console output to a log file while simultaneously displaying it on screen — covering Start-Transcript and redirection operators. - [Simple PowerShell Password Generator](https://www.powershellcenter.com/2021/03/30/simple-powershell-password-generator/): A two-line PowerShell password generator using System.Web.Security.Membership.GeneratePassword with configurable length and complexity. - [Powershell FIX: WARNING: Unable to resolve package source 'https://www.powershellgallery.com/api/v2'](https://www.powershellcenter.com/2020/08/27/powershell-fix-warning-unable-to-resolve-package-source-https-www-powershellgallery-com-api-v2/): Fix for the PowerShellGet TLS connectivity issue that prevents accessing PowerShell Gallery on older Windows systems. --- ## Infrastructure & Virtualization - [Reboot Unregistered VM in Citrix Virtual Desktop](https://www.powershellcenter.com/2020/10/18/powershell-detect-and-reboot-failed-unregistered-vm-in-citrix-xendesktop-esxi-hosted/): PowerShell automation to detect and reboot unregistered VMs in a Citrix XenDesktop environment hosted on VMware ESXi, restoring VDA communication. - [PowerShell: Moving data from FSLogix to another VirtualDesktop Environment](https://www.powershellcenter.com/2021/06/05/powershell-moving-data-from-fslogix-to-another-virtualdesktop-environment/): Script to migrate FSLogix profile containers from one virtual desktop environment (Citrix XenDesktop) to another without data loss. - [Xen Virtual Desktop Cannot Connect to vCenter after a Certificate Update](https://www.powershellcenter.com/2021/01/24/xendesktop-fail-with-renewed-vcenter-certificate/): Resolution for Citrix Virtual Desktop failing to connect to VMware vCenter after renewing the vCenter SSL certificate — involves updating trust in Citrix. - [Get-VM Conflict between Hyper-V PS and PowerCLI](https://www.powershellcenter.com/2020/12/01/get-vm-conflict-between-hyper-v-ps-and-powercli/): How to resolve the module conflict that occurs when both the Hyper-V PowerShell module and VMware PowerCLI are installed and export an identical Get-VM command. - [Automate VMWare ESXi Standard Maintenance Mode](https://www.powershellcenter.com/2020/08/14/vmware_esxi_standard_maintenance/): PowerShell automation to handle VMware ESXi Standard (non-vCenter) maintenance mode — migrates VMs off the host before maintenance and restores after. - [Convert MBR to GPT Without Losing Data](https://www.powershellcenter.com/2020/09/05/convert-to-gpt-from-mbr-without-losing-any-data-work-on-exchange-dag/): How to convert a Windows disk from MBR to GPT partition style without losing data, including notes for Exchange Server DAG configurations. - [Test RPC Connection using PortQry and PowerShell](https://www.powershellcenter.com/2021/02/06/test-rpc-connection-with-the-dynamic-ports/): Testing RPC connectivity across dynamic ports using PortQry and PowerShell — critical for diagnosing communication failures in AD and distributed services. --- ## Optional: Full Content Index > AI crawlers and search engines seeking full content should read individual post URLs listed above. Each post contains the complete article text, code samples, step-by-step instructions, and screenshots. The site does not block AI crawlers. Content is original, written by Faris Malaeb, and licensed for reference and citation. > For the most up-to-date list of posts, refer to: https://www.powershellcenter.com/ > Contact: faris.malaeb@mbc.net | Twitter/X: @FarisMalaeb