<feed xmlns="http://www.w3.org/2005/Atom"><title>Blog</title><id>https://evotec.xyz/blog/index.atom.xml</id><updated>2025-06-15T19:52:52.0000000Z</updated><subtitle>Technical articles, tutorials, and insights on PowerShell, .NET, Active Directory, and enterprise IT automation.</subtitle><link href="https://evotec.xyz/blog" /><link href="https://evotec.xyz/blog/index.atom.xml" rel="self" type="application/atom+xml" /><entry><title>Supercharging Your Network Diagnostics with Globalping for NET</title><id>https://evotec.xyz/blog/supercharging-your-network-diagnostics-with-globalping-for-net</id><link href="https://evotec.xyz/blog/supercharging-your-network-diagnostics-with-globalping-for-net" /><updated>2025-06-15T19:52:52.0000000Z</updated><summary>Ever wondered how to run network diagnostics like Ping, Traceroute, or DNS queries from probes scattered across the globe? Enter Globalping.NET, a powerful library that makes it effortless to interact with the Globalping API using C#. Whether you’re debugging latency issues or exploring packet routes, this library has you covered.</summary><category term=".NET Products" /><category term="csharp" /><category term="globalping" /><category term="library" /></entry><entry><title>Automating Network Diagnostics with Globalping PowerShell Module</title><id>https://evotec.xyz/blog/automating-network-diagnostics-with-globalping-powershell-module</id><link href="https://evotec.xyz/blog/automating-network-diagnostics-with-globalping-powershell-module" /><updated>2025-06-15T19:52:50.0000000Z</updated><summary>Are you tired of manually running network diagnostics like Ping, Traceroute, or DNS queries? The Globalping PowerShell Module is here to save the day! With its easy-to-use cmdlets, you can automate measurements from probes distributed across the globe.</summary><category term="PowerShell" /></entry><entry><title>Enhanced Dashboards with PSWriteHTML – Introducing InfoCards and Density Options</title><id>https://evotec.xyz/blog/enhanced-dashboards-with-pswritehtml-introducing-infocards-and-density-options</id><link href="https://evotec.xyz/blog/enhanced-dashboards-with-pswritehtml-introducing-infocards-and-density-options" /><updated>2025-06-04T13:54:28.0000000Z</updated><summary>Discover new features in the PSWriteHTML PowerShell module – including New-HTMLInfoCard, improved layout controls with the -Density parameter, and customizable shadows for clean, modern dashboards and reports.</summary><category term="css" /><category term="html" /><category term="js" /><category term="PowerShell" /><category term="pswritehtml" /><category term="reporting" /></entry><entry><title>Mastering Active Directory Hygiene: Automating SIDHistory Cleanup with CleanupMonster</title><id>https://evotec.xyz/blog/mastering-active-directory-hygiene-automating-sidhistory-cleanup-with-cleanupmonster</id><link href="https://evotec.xyz/blog/mastering-active-directory-hygiene-automating-sidhistory-cleanup-with-cleanupmonster" /><updated>2025-03-16T18:47:45.0000000Z</updated><summary>Security Identifier (SID) History is a useful mechanism in Active Directory (AD) migrations. It allows users and groups in a new domain to retain access to resources that still rely on permissions from the old domain. However, once migrations are completed, these historical SIDs can become clutter, posing both security and administrative challenges. While it’s best to remove unnecessary SID History as soon as you’re done migrating, many environments skip this step. Over time, decommissioned or broken trusts make cleanup more difficult, and domain objects can accrue so many old entries that you lose track of what is still required.</summary><category term="Active Directory" /><category term="activedirectory" /><category term="cleanup" /><category term="powershell" /></entry><entry><title>Upgrade Azure Active Directory Connect fails with unexpected error</title><id>https://evotec.xyz/blog/upgrade-azure-active-directory-connect-fails-with-unexpected-error</id><link href="https://evotec.xyz/blog/upgrade-azure-active-directory-connect-fails-with-unexpected-error" /><updated>2024-10-02T12:17:34.0000000Z</updated><summary>Today, I made the decision to upgrade my test environment and update the version of Azure AD Connect to the latest one. The process is usually simple: download a new MSI, run it, click next a few times, enter the credentials for your Global Admin, and you’re finished. However, this time, I encountered an error.</summary><category term="azure ad" /><category term="azure adconnect" /><category term="error" /><category term="errors" /><category term="Office 365" /><category term="office365" /></entry><entry><title>Mastering Active Directory Hygiene: Automating Stale Computer Cleanup with CleanupMonster</title><id>https://evotec.xyz/blog/mastering-active-directory-hygiene-automating-stale-computer-cleanup-with-cleanupmonster</id><link href="https://evotec.xyz/blog/mastering-active-directory-hygiene-automating-stale-computer-cleanup-with-cleanupmonster" /><updated>2024-08-25T13:14:39.0000000Z</updated><summary>Have you ever looked at your Active Directory and wondered, “Why do I still have computers listed that haven’t been turned on since World Cup 2016?” Yeah, we’ve all been there. Keeping AD clean and up-to-date is like trying to organize your garage—it’s easy to put off until it becomes a total mess.</summary><category term="active directory" /><category term="ad" /><category term="cleanup" /><category term="intune" /><category term="microsoft entra" /><category term="powershell" /></entry><entry><title>Active Directory Replication Summary to your Email or Microsoft Teams</title><id>https://evotec.xyz/blog/active-directory-replication-summary-to-your-email</id><link href="https://evotec.xyz/blog/active-directory-replication-summary-to-your-email" /><updated>2024-04-17T19:25:32.0000000Z</updated><summary>Active Directory replication is a critical process that ensures the consistent and up-to-date state of directory information across all domain controllers in a domain. Monitoring this process is important as it helps identify any issues that may arise and resolve them quickly. One way to monitor Active Directory replication is by using the Repadmin command-line tool. Repadmin provides a wealth of information about the replication status and health of a domain. However, manually checking the Repadmin output can be time-consuming and tedious, and running it manually every 30 minutes just to check if everything is great doesn’t seem like a great idea. While PowerShell has its own commands around replication I’ve not found something as fast and reliable as repadmin /replsummary.</summary><category term="active directory" /><category term="powershell" /><category term="replication" /></entry><entry><title>Syncing Global Address List (GAL) to personal contacts and between Office 365 tenants with PowerShell</title><id>https://evotec.xyz/blog/syncing-global-address-list-gal-to-personal-contacts-and-between-office-365-tenants-with-powershell</id><link href="https://evotec.xyz/blog/syncing-global-address-list-gal-to-personal-contacts-and-between-office-365-tenants-with-powershell" /><updated>2023-12-03T16:32:13.0000000Z</updated><summary>Hey there! Today, I wanted to introduce you to one of the small but excellent module I’ve created called the O365Synchronizer. This module focuses on synchronizing contacts and users. If you’ve ever been tasked with synchronizing Global Address Lists (GAL) across different Office 365 tenants or just wanted to sync GAL with user mailboxes so they can access contacts directly on their phones, this tool is for you.</summary><category term="api" /><category term="exchange" /><category term="microsoft graph" /><category term="office 365" /><category term="powershell" /></entry><entry><title>Active Directory Health Check using Microsoft Entra Connect Health Service</title><id>https://evotec.xyz/blog/active-directory-health-check-using-microsoft-entra-connect-health-service</id><link href="https://evotec.xyz/blog/active-directory-health-check-using-microsoft-entra-connect-health-service" /><updated>2023-10-08T14:36:57.0000000Z</updated><summary>Active Directory (AD) is crucial in managing identities and resources within an organization. Ensuring its health is pivotal for the seamless operation of various services. Today, I decided to look at Microsoft Entra Connect Health (Azure AD Connect Health) service, which allows monitoring Azure AD Connect, ADFS, and Active Directory. This means that under a single umbrella, you can have an overview of three services health. But is it worth it?</summary><category term="Active Directory" /><category term="Azure" /><category term="azure ad" /><category term="health checks" /><category term="microsoft entra" /><category term="powershell" /></entry><entry><title>Seamless HTML Report Creation: Harness the Power of Markdown with PSWriteHTML PowerShell Module</title><id>https://evotec.xyz/blog/unlocking-seamless-html-report-creation-harness-the-power-of-markdown-with-pswritehtml-powershell-module</id><link href="https://evotec.xyz/blog/unlocking-seamless-html-report-creation-harness-the-power-of-markdown-with-pswritehtml-powershell-module" /><updated>2023-09-03T16:59:27.0000000Z</updated><summary>In today’s digital age, the ability to create compelling and informative HTML reports and documents is a crucial skill for professionals in various fields. Whether you’re a data analyst, a system administrator, a developer, or simply someone who wants to present information in an organized and visually appealing manner, having the right tools at your disposal can make all the difference. That’s where the PSWriteHTML PowerShell module steps in, offering an array of possibilities to suit your reporting needs.</summary><category term="css" /><category term="html" /><category term="markdown" /><category term="powershell" /><category term="powershell module" /><category term="pswritehtml" /></entry><entry><title>How to Efficiently Remove Comments from Your PowerShell Script</title><id>https://evotec.xyz/blog/how-to-efficiently-remove-comments-from-your-powershell-script</id><link href="https://evotec.xyz/blog/how-to-efficiently-remove-comments-from-your-powershell-script" /><updated>2023-08-20T15:43:09.0000000Z</updated><summary>As part of my daily development, I create lots of code that I subsequently comment on and leave to ensure I understand what I tried, what worked, and what didn’t. This is my usual method of solving a problem. Sure, I could commit it to git and then look it up, and I do that, but that doesn’t change my behavior where I happen to have lots of “junk” inside of my functions that stay commented out. While this works for me, and I’ve accepted this as part of my process, I don’t believe this should be part of the production code on PowerShellGallery or when the code is deployed.</summary><category term="cleanup" /><category term="comment" /><category term="powershell" /><category term="remove" /><category term="script" /></entry><entry><title>Unlocking PowerShell Magic: Different Approach to Creating ‘Empty’ PSCustomObjects</title><id>https://evotec.xyz/blog/unlocking-powershell-magic-different-approach-to-creating-empty-pscustomobjects</id><link href="https://evotec.xyz/blog/unlocking-powershell-magic-different-approach-to-creating-empty-pscustomobjects" /><updated>2023-08-10T09:27:32.0000000Z</updated><summary>Today I saw an article from Christian Ritter, “PowerShell: Creating an “empty” PSCustomObject” on X that got me curious. Do people create empty objects like Christian proposes? I want to offer an alternative to Christian’s article, which uses OrderedDictionary and converts to PSCustomObject.</summary><category term="conversion" /><category term="hashtable" /><category term="ordereddictionary" /><category term="powershell" /><category term="pscustomobject" /></entry><entry><title>Report Active Directory Accounts that are Synchronized with Azure AD</title><id>https://evotec.xyz/blog/report-active-directory-accounts-that-are-synchronized-with-azure-ad</id><link href="https://evotec.xyz/blog/report-active-directory-accounts-that-are-synchronized-with-azure-ad" /><updated>2023-08-07T13:21:18.0000000Z</updated><summary>I was scrolling X (aka Twitter) today and saw this blog post, “PowerShell: Report On-Premises Active Directory Accounts that are Synchronized with Azure AD Connect” by Kevin Trent. I like reading blog posts as I tend to learn some new things and see how people tend to solve their problems.</summary><category term="active directory" /><category term="ad" /><category term="azure ad" /><category term="microsoft graph" /><category term="powershell" /></entry><entry><title>Function cannot be created because function capacity 4096 has been exceeded for this scope</title><id>https://evotec.xyz/blog/function-cannot-be-created-because-function-capacity-4096-has-been-exceeded-for-this-scope</id><link href="https://evotec.xyz/blog/function-cannot-be-created-because-function-capacity-4096-has-been-exceeded-for-this-scope" /><updated>2023-08-01T06:22:34.0000000Z</updated><summary>I had a long day today when my long-running script (10 hours) gave me weird errors with Microsoft Graph for Teams. Finally, I solved my mistakes and reran the hand to see if the report would be complete this time. Surprisingly, it gave me an error I’d never seen before. “Function cannot be created because function capacity 4096 has been exceeded for this scope”. The error is at least weird because it’s shown on a production server where I’ve just a handful of PowerShell modules installed, and I’ve never seen it on my development machine where I’ve over 200 modules.</summary><category term="aliases" /><category term="errors" /><category term="functions" /><category term="limits" /><category term="powershell" /><category term="windows powershell" /></entry><entry><title>Connect-MgGraph: Keyset does not exist</title><id>https://evotec.xyz/blog/connect-mggraph-keyset-does-not-exist</id><link href="https://evotec.xyz/blog/connect-mggraph-keyset-does-not-exist" /><updated>2023-07-20T07:07:41.0000000Z</updated><summary>I had this little issue today when I tried to schedule the Microsoft Graph script to run as a service account on a certificate. To my surprise, even tho I had all permissions required, I was getting this error message: Connect-MgGraph: Keyset does not exist. Something that didn’t show up for my user.</summary><category term="connet-mggraph" /><category term="graph" /><category term="graph-sdk" /><category term="microsoft graph" /><category term="powershell" /></entry><entry><title>Strengthening Password Security in Active Directory: A PowerShell-Powered Approach</title><id>https://evotec.xyz/blog/strengthening-password-security-in-active-directory-a-powershell-powered-approach</id><link href="https://evotec.xyz/blog/strengthening-password-security-in-active-directory-a-powershell-powered-approach" /><updated>2023-05-28T14:40:25.0000000Z</updated><summary>PasswordSolution uses the DSInternals PowerShell module to gather Active Directory hashes and then combines that data into a prettified report. If you have ever used DSInternals, you know that while very powerful, it comes with raw data that is hard to process and requires some skills to get it into a state that can be shown to management or security.</summary><category term="active directory" /><category term="ad" /><category term="dsinternals" /><category term="html" /><category term="password quality" /><category term="passwordsolution" /><category term="powershell" /><category term="scan" /><category term="security" /><category term="Windows" /></entry><entry><title>Track Ubiquiti Unifi Stock, and get notified of changes</title><id>https://evotec.xyz/blog/simplify-notifications-about-ubiquiti-unifi-stock</id><link href="https://evotec.xyz/blog/simplify-notifications-about-ubiquiti-unifi-stock" /><updated>2023-04-16T15:04:57.0000000Z</updated><summary>I am a pretty big fan of Ubiquiti and their Unifi products line. Whether it’s network equipment or their camera systems, Unifi Protect, I have it all, and I’m pretty happy with how it works. However, over the last two years, some of their stocks in the store were very hard to find. For example, I’ve searched for Unifi Protect G4 Doorbell Pro for over six months. I’ve tried local shops all around Europe, even in the Ubiquiti Europe store, to never found any of them.</summary><category term="notifications" /><category term="powershell" /><category term="stock" /><category term="tracker" /><category term="ubiquiti" /><category term="unifi" /><category term="windows" /></entry><entry><title>Free Microsoft Azure/Office365 Fundamentals Training starting February 6th 2023</title><id>https://evotec.xyz/blog/microsoft-fundamental-free-training-starting-february-6th-2023</id><link href="https://evotec.xyz/blog/microsoft-fundamental-free-training-starting-february-6th-2023" /><updated>2023-02-04T10:03:56.0000000Z</updated><summary>Being a Microsoft MVP has quite a few benefits. You get to be part of unique offers that help you enhance your knowledge even further. Microsoft Learning team decided to provide free training on Microsoft Fundamentals for MVPs and the Microsoft community, so I’m sharing this with you! Starting next week, Microsoft will run each activity from 9 AM to 5 PM Eastern Standard Time (EST) or 15:00 to 23:00 in Europe (CET).</summary><category term="azure" /><category term="free" /><category term="o365" /><category term="office 365" /><category term="training" /></entry><entry><title>Upload and Download files from Azure Blob Storage using Connection String</title><id>https://evotec.xyz/blog/upload-and-download-files-from-azure-blob-storage-using-connection-string</id><link href="https://evotec.xyz/blog/upload-and-download-files-from-azure-blob-storage-using-connection-string" /><updated>2023-01-18T19:13:24.0000000Z</updated><summary>They say there is a first time for everything. For me, it’s how to download and upload files to Azure Blog Storage using Connection String. Recently I was given Connection String, Container name and had to download some files from Azur Blog Storage. After some research and trying Connect-AzAccount, I found that the proper way to go is thru New-AzStorageContext.</summary><category term="az.storage" /><category term="azure ad" /><category term="azure blob storage" /><category term="download" /><category term="powershell" /><category term="upload" /></entry><entry><title>PowerBGInfo – PowerShell alternative to Sysinternals BGInfo</title><id>https://evotec.xyz/blog/powerbginfo-powershell-alternative-to-sysinternals-bginfo</id><link href="https://evotec.xyz/blog/powerbginfo-powershell-alternative-to-sysinternals-bginfo" /><updated>2023-01-01T15:51:00.0000000Z</updated><summary>When I created ImagePlayground, I thought about how to show its usefulness to the general community. On how to deliver what PowerShell can do. Then I saw on some forum people asking BGInfo to expand and allow running PowerShell scripts so that the data on the BGInfo Wallpaper can be gathered from PowerShell rather than VBS. I thought this was a great idea to create BGInfo using PowerShell without the necessity of using BGInfo at all.</summary><category term="bginfo" /><category term="desktop manager" /><category term="module" /><category term="powerbginfo" /><category term="powershell" /><category term="wallpaper" /><category term="windows" /></entry><entry><title>Image Manipulation, Image Resize, Image Combine and more with PowerShell</title><id>https://evotec.xyz/blog/image-manipulation-image-resize-image-combine-and-more-with-powershell</id><link href="https://evotec.xyz/blog/image-manipulation-image-resize-image-combine-and-more-with-powershell" /><updated>2023-01-01T15:50:41.0000000Z</updated><summary>ImagePlayground is a PowerShell module that works in PowerShell 5.1 and PowerShell 7+. It works partially on Linux and should work on macOS, except for charts. That means it’s partially cross-platform, but the end goal is to make it work fully on all platforms. So what can this module do?</summary><category term=".net" /><category term=".NET Products" /><category term="bar code" /><category term="combine" /><category term="convert" /><category term="exif data" /><category term="grayscale" /><category term="image" /><category term="image manipulation" /><category term="linux" /><category term="macos" /><category term="net core" /><category term="net framework" /><category term="net standard" /><category term="powershell" /><category term="qr code" /><category term="watermark" /><category term="xplat" /></entry><entry><title>Easy way to send emails using Microsoft Graph API (Office 365) with PowerShell</title><id>https://evotec.xyz/blog/easy-way-to-send-emails-using-microsoft-graph-api-office-365-with-powershell</id><link href="https://evotec.xyz/blog/easy-way-to-send-emails-using-microsoft-graph-api-office-365-with-powershell" /><updated>2022-10-09T13:27:27.0000000Z</updated><summary>When you’re using Office 365 and want to send an email, you have two choices SMTP or Microsoft Graph API, which is a “new” kid on the block. For some time, I’ve used Microsoft Graph exclusively to send emails in favor of SMTP as it’s much easier to manage and generally works over HTTPS. If you type in google “Send email graph API PowerShell,” you will get lots of hits as bloggers, and Microsoft has already covered this topic. It’s even more critical than ever because Basic Authentication is deprecated in Office 365. To help out with the transition, Microsoft even released its PowerShell module. With Send-MgUserMail proposed as a way to send emails via Graph API, you will notice it’s far from being easy &amp; user-friendly. Over two years ago, I released a PowerShell module called Mailozaurr (some people may not like my modules’ naming – but that’s how I roll!). In a blog post, Mailozaurr – New mail toolkit (SMTP, IMAP, POP3) with support for oAuth 2.0 and GraphApi for PowerShell, I’ve shown a basic functionality on how to send emails using SMTP OAuth 2.0 or Graph API, which aims to be drag &amp; drop replacement over Send-MailMessage and is supposed to be as simple as possible to send an email with a low effort and high readability. You can also read on sending emails using Graph API by Tony Redmond in his blog post Moving on from Send-MailMessage: Sending Email from PowerShell using the Graph API.</summary><category term="Azure Application" /><category term="emails" /><category term="Exchange" /><category term="graph api" /><category term="microsoft graph" /><category term="oauth2" /><category term="office 365" /><category term="powershell" /><category term="send-emailmessage" /><category term="send-mailmessage" /><category term="smtp" /></entry><entry><title>Adaptive Cards with Tables and Linebreaks in Microsoft Teams</title><id>https://evotec.xyz/blog/adaptive-cards-with-tables-and-linebreaks-in-microsoft-teams</id><link href="https://evotec.xyz/blog/adaptive-cards-with-tables-and-linebreaks-in-microsoft-teams" /><updated>2022-08-21T16:07:01.0000000Z</updated><summary>PSTeams is a PowerShell module that helps simplify sending notifications to Microsoft Teams via Incoming webhooks. It’s easy to use and doesn’t require playing with JSON. Since version 2.0, it started to support Adaptive Cards; in version 2.1, I’ve added the ability to mention people. Today I’m introducing an easy way to send data as a table and a quick way to add a line break.</summary><category term="adaptive cards" /><category term="microsoft teams" /><category term="office 365" /><category term="powershell" /><category term="teams" /></entry><entry><title>Working with VirusTotal from PowerShell</title><id>https://evotec.xyz/blog/working-with-virustotal-from-powershell</id><link href="https://evotec.xyz/blog/working-with-virustotal-from-powershell" /><updated>2022-08-10T18:25:07.0000000Z</updated><summary>Virus Total is an excellent service. It’s a single place where hundreds of antivirus engines can verify if the file, URL, domain name, or IP Address is trusted or not. Of course, it’s not a silver bullet, but it brings tremendous value, and I often verify files I download before executing. Since I release a lot of new or updated PowerShell modules on a weekly/monthly basis, I thought it would be great to send newly released versions straight to Virus Total so I can have them checked before anyone executes them. I also hope to prevent false positives from some antivirus vendors that may tag my modules as malware because they haven’t seen the DLL or PowerShell module in this form before. I’ve seen it happen to DBATools, so why not try and push my modules before users even use them?</summary><category term="api" /><category term="powershell" /><category term="restapi" /><category term="security" /><category term="virus" /><category term="virus total" /></entry><entry><title>Reporting group membership for critical Active Directory groups</title><id>https://evotec.xyz/blog/reporting-group-membership-for-critical-active-directory-groups</id><link href="https://evotec.xyz/blog/reporting-group-membership-for-critical-active-directory-groups" /><updated>2022-08-07T11:57:28.0000000Z</updated><summary>I work a lot with Active Directory-related tasks. One of the tasks is to know the group membership of critical Active Directory Groups such as Domain Admins, Enterprise Admins, Schema Admins, Event Log Readers, and a few others that are a bit less known. As I did it, I got bored of typing the group names repeatedly and decided that enough was enough and there must be an easier way for me to do that.</summary><category term="active directory" /><category term="ad" /><category term="group membership" /><category term="groups" /><category term="nested groups" /><category term="powershell" /><category term="Windows" /></entry><entry><title>Finding duplicate DNS records by IP Address using PowerShell</title><id>https://evotec.xyz/blog/finding-duplicate-dns-records-by-ip-adress-using-powershell</id><link href="https://evotec.xyz/blog/finding-duplicate-dns-records-by-ip-adress-using-powershell" /><updated>2022-07-26T17:23:53.0000000Z</updated><summary>In my earlier blog post, I showed you a way to find duplicate DNS entries using PowerShell, but the focus was on finding duplicate entries based on hostname. But what if you would like to find duplicate entries based on IP Addresses? This was the question I was asked on Reddit, and I thought it was a legitimate request, so today’s focus will be on transposing table output from earlier functions to present data differently.</summary><category term="active directory" /><category term="dns" /><category term="DNSServer" /><category term="duplicates" /><category term="powershell" /></entry><entry><title>Finding duplicate DNS entries using PowerShell</title><id>https://evotec.xyz/blog/finding-duplicate-dns-entries-using-powershell</id><link href="https://evotec.xyz/blog/finding-duplicate-dns-entries-using-powershell" /><updated>2022-07-24T16:48:21.0000000Z</updated><summary>Today’s blog post is about Active Directory-integrated DNS and how to find duplicate entries. By duplicate, I mean those where one DNS name matches multiple IP addresses. While some duplicate DNS entries are expected, in other cases, it may lead to problems. For example, having a static IP assigned to a hostname that later on is also updated with dynamic entries.</summary><category term="active directory" /><category term="ad" /><category term="dns" /><category term="DNSServer" /><category term="powershell" /></entry><entry><title>OfficeIMO – Free cross-platform Microsoft Word .NET library</title><id>https://evotec.xyz/blog/officeimo-free-cross-platform-microsoft-word-net-library</id><link href="https://evotec.xyz/blog/officeimo-free-cross-platform-microsoft-word-net-library" /><updated>2022-06-12T16:14:01.0000000Z</updated><summary>I’ve created a cross-platform (Windows, Linux, macOS) Word library based on Open XML SDK that heavily simplifies creating and modifying Word documents. Open XML SDK, while excellent, requires you to do a lot of work to make even simple documents. For example, if you want to use Table styles, you need first to define those styles, put them in a specific place, and assign them to a table. The same goes for lists, images, hyperlinks, bookmarks, and many other Microsoft Word types. Creating sections, managing headers, and footers – all that is possible using Open XML SDK, but it’s far from easy. At least for a noob like me. You have to know the order to put them into the document; you must know the places and track IDs to all the elements. And trust me – it’s not fun.</summary><category term="c#" /><category term="csharp" /><category term="docx" /><category term="microsoft office" /><category term="Office 365" /><category term="officeimo" /><category term="Windows" /><category term="word" /></entry><entry><title>Reading IIS logs with PowerShell</title><id>https://evotec.xyz/blog/reading-iis-logs-with-powershell</id><link href="https://evotec.xyz/blog/reading-iis-logs-with-powershell" /><updated>2022-06-04T19:47:08.0000000Z</updated><summary>Today I was reading Twitter, as I am pretty addicted to technology news when Adam Bacon mentioned that he’s surprised that no one has rebuilt IIS Parser as pure PowerShell. While this is not entirely true, and some modules can do some parsing, I decided to try my luck. While doing it from scratch in PowerShell is possible, I opted to use an external C# library that does all the heavy lifting and is optimized for speed.</summary><category term="iis" /><category term="iis-server" /><category term="logs" /><category term="powershell" /><category term="Windows" /></entry><entry><title>PowerShell – Comparing advanced objects</title><id>https://evotec.xyz/blog/powershell-comparing-advanced-objects</id><link href="https://evotec.xyz/blog/powershell-comparing-advanced-objects" /><updated>2022-02-28T16:22:25.0000000Z</updated><summary>Two years ago, I wrote a blog post on how you can compare two or more objects visually in PowerShell that works on Windows, Linux, or macOS. I’ve been using that for a while, but it had a specific flaw. Comparing more advanced objects that you often see (for example, returned by Graph API, two config files) wasn’t working correctly, often throwing errors. The reason for this was that having nested hashtables arrays require more advanced logic. Today I’ve updated my module to use the ConvertTo-FlatObject function, which allows the Compare-MultipleObjects function to compare suitably more advanced objects hopefully. Of course, it should not throw errors anymore.</summary><category term="compare" /><category term="html" /><category term="powershell" /><category term="pssharedgoods" /><category term="pswritehtml" /></entry><entry><title>PowerShell – Converting advanced object to flat object</title><id>https://evotec.xyz/blog/powershell-converting-advanced-object-to-flat-object</id><link href="https://evotec.xyz/blog/powershell-converting-advanced-object-to-flat-object" /><updated>2022-02-27T14:57:20.0000000Z</updated><summary>PowerShell language allows you to work and build complicated objects. There are multiple ways to save them, such as XML or JSON, but sometimes using them is impossible or inadequate. Sometimes you want to use HTML or CSV or any other single dimension output.</summary><category term="convert" /><category term="export-csv" /><category term="office 365" /><category term="powershell" /><category term="pswritehtml" /></entry><entry><title>Office 365 Health Service using PowerShell</title><id>https://evotec.xyz/blog/office-365-health-service-using-powershell</id><link href="https://evotec.xyz/blog/office-365-health-service-using-powershell" /><updated>2022-02-14T17:48:15.0000000Z</updated><summary>Two years ago, I wrote a PowerShell module called PSWinDocumentation.O365HealthService. The idea was simple – replicate Health Service data Microsoft offers in Office Portal so you can do with data whatever you want and display it however you like. I’ve written about it in this blog post. A few weeks back, someone reported that the module stopped working, and I’ve confirmed it indeed no longer works! Initially, I thought that maybe some data format changed, as it changed multiple times, or perhaps the date format was wrong again, but no. Microsoft has deprecated Office 365 Service Communications API reference and instead tells us that Service Health is now only available via Microsoft Graph API. Is it only me who didn’t get the memo about this?</summary><category term="documentation" /><category term="health" /><category term="office 365" /><category term="powershell" /><category term="pswindocumentation" /><category term="pswritehtml" /><category term="reporting" /></entry><entry><title>Difference between GetTempFileName() and GetRandomFileName() that got my ass kicked</title><id>https://evotec.xyz/blog/difference-between-gettempfilename-and-getrandomfilename-that-got-my-ass-kicked</id><link href="https://evotec.xyz/blog/difference-between-gettempfilename-and-getrandomfilename-that-got-my-ass-kicked" /><updated>2022-01-24T18:51:13.0000000Z</updated><summary>Today’s story is about me making assumptions on how things work based on the method’s name. As the blog post says, I want to focus on two similar methods – GetTempFileName() and GetRandomFileName(), when using PowerShell. Still, since those methods are .NET based, it applies to a whole range of other languages – C#, F#, VisualBasic, and all others that I’ve never used.</summary><category term=".net" /><category term="c#" /><category term="powershell" /><category term="Windows" /></entry><entry><title>Mentioning users in notifications using PSTeams PowerShell Module</title><id>https://evotec.xyz/blog/mentioning-users-in-notifications-using-psteams-powershell-module</id><link href="https://evotec.xyz/blog/mentioning-users-in-notifications-using-psteams-powershell-module" /><updated>2022-01-16T19:08:52.0000000Z</updated><summary>Microsoft Teams over the last few years have grown into an excellent and flexible tool for both small and big companies. Having the ability to chat with users, store files or have all sorts of data in one place makes it easy and functional. Of course, it has its fair share of issues, but it’s getting better. One of the cool features of Microsoft Teams is being able to send notifications to Microsoft Teams Channels using WebHook Notifications. In the beginning, this feature was pretty limited, but after a few years, it got much better with support for Adaptive Cards, List Cards, Hero Cards, Thumbnail Cards, and Office 365 Connector Card.</summary><category term="Azure AD" /><category term="microsoft teams" /><category term="office 365" /><category term="powershell" /><category term="psteams" /></entry><entry><title>Finding duplicate SPN with PowerShell</title><id>https://evotec.xyz/blog/finding-duplicate-spn-with-powershell</id><link href="https://evotec.xyz/blog/finding-duplicate-spn-with-powershell" /><updated>2021-12-07T15:32:01.0000000Z</updated><summary>Duplicate SPNs aren’t very common but can happen in any Active Directory as there’s no built-in way that tracks and prevent duplicate SPN’s. One has to either know all SPN’s in the environment, track them or check each time whether it already exists or not. Things get more complicated with larger Active Directory environments as people change, new apps are added, old apps are forgotten, but SPNs prevail.</summary><category term="active directory" /><category term="ad" /><category term="adessentials" /><category term="forest" /><category term="powershell" /><category term="spn" /><category term="testimo" /></entry><entry><title>Solving typo problems with Fuzzy Search in PSWriteHTML</title><id>https://evotec.xyz/blog/solving-typo-problems-with-fuzzy-search-in-pswritehtml</id><link href="https://evotec.xyz/blog/solving-typo-problems-with-fuzzy-search-in-pswritehtml" /><updated>2021-11-29T18:53:28.0000000Z</updated><summary>One of the everyday use cases with PSWriteHTML is to create a simple view of PowerShell data in a table. While PowerShell comes with a built-in cmdlet ConvertTo-Html, it’s basic in its functionality. It makes an HTML representation of PowerShell data, but it brings no CSS, JavaScript, or other functionality. While for some use cases, it’s enough, the other times, you need to make an effort to make it usable.</summary><category term="css" /><category term="fuzzysearch" /><category term="html" /><category term="javascript" /><category term="js" /><category term="out-htmlview" /><category term="powershell" /><category term="pswritehtml" /><category term="reporting" /></entry><entry><title>Active Directory Domain Services could not replicate the directory partition – The replication operation encountered a database error</title><id>https://evotec.xyz/blog/active-directory-domain-services-could-not-replicate-the-directory-partition-the-replication-operation-encountered-a-database-error</id><link href="https://evotec.xyz/blog/active-directory-domain-services-could-not-replicate-the-directory-partition-the-replication-operation-encountered-a-database-error" /><updated>2021-11-28T14:38:20.0000000Z</updated><summary>If you ever encounter an error while trying to create a new domain within a forest saying, “The replication operation encountered a database error,” it makes you sweat a bit. Your brain tells you it will be a nightmare to fix, do I have proper backups to make it happen, and the question “why now” shows up.</summary><category term="active directory" /><category term="dcdiag" /><category term="dfs" /><category term="domain" /><category term="forest" /><category term="forest replication" /><category term="PowerShell" /><category term="testimo" /><category term="Windows" /></entry><entry><title>Configuring Office 365 settings using PowerShell – The non-supported way</title><id>https://evotec.xyz/blog/configuring-office-365-settings-using-powershell-the-non-supported-way</id><link href="https://evotec.xyz/blog/configuring-office-365-settings-using-powershell-the-non-supported-way" /><updated>2021-09-26T15:12:35.0000000Z</updated><summary>Office 365 is a huge beast. It has so many services that it’s hard to track all of them. It’s even harder if you want to manage Office 365 using PowerShell. Microsoft makes many different PowerShell modules available for you, such as AzureAD, AzureADPreview, ExchangeOnline, MicrosoftTeams, and recently, Microsoft.Graph. But even with so many different modules, there are still tasks that Microsoft won’t let you do from PowerShell. But it doesn’t mean that it’s not possible to do it. I’ve spent some time tracking how Microsoft does things while you click thru the interface and created an O365Essentials PowerShell module that can do it in an automated way.</summary><category term="Azure" /><category term="Azure AD" /><category term="graph api" /><category term="microsoft graph" /><category term="microsoft office 365" /><category term="module" /><category term="o365essentials" /><category term="office 365" /><category term="powershell" /><category term="powershellgallery" /></entry><entry><title>Encrypting and decrypting PGP using PowerShell</title><id>https://evotec.xyz/blog/encrypting-and-decrypting-pgp-using-powershell</id><link href="https://evotec.xyz/blog/encrypting-and-decrypting-pgp-using-powershell" /><updated>2021-09-12T15:14:12.0000000Z</updated><summary>Some time ago, I decided that having an easy-to-use PGP PowerShell module is a way to kill my boredom. Four months have passed, and I decided to share it with the world, as it may be helpful to some of you. Today I would like to introduce you to PSPGP – PowerShell module that provides PGP functionality in PowerShell.</summary><category term="gpg" /><category term="pgp" /><category term="powershell" /><category term="windows" /></entry><entry><title>Easy way to connect to FTPS and SFTP using PowerShell</title><id>https://evotec.xyz/blog/easy-way-to-connect-to-ftps-and-sftp-using-powershell</id><link href="https://evotec.xyz/blog/easy-way-to-connect-to-ftps-and-sftp-using-powershell" /><updated>2021-08-29T13:47:48.0000000Z</updated><summary>FTPS and SFTP are two ways to send and receive files from remote sources. While the name suggests both do the same thing, those are different protocols, in the end, having the same goal. A few weeks back, I had to make sure I can reliably download files from FTPS server using PowerShell, and since I couldn’t find anything straightforward to use, I decided to write my own. Transfertto is a new PowerShell module that supports both FTPS and SFTP protocols. Its goal is to be the only module that you need to transfer files to and from FTP/SFTP servers.</summary><category term="ftp" /><category term="ftps" /><category term="powershell" /><category term="sftp" /><category term="ssh" /><category term="transferetto" /><category term="Windows" /></entry><entry><title>Sending email as an alias (proxy address) with Office 365</title><id>https://evotec.xyz/blog/sending-email-as-an-alias-proxy-address-with-office-365</id><link href="https://evotec.xyz/blog/sending-email-as-an-alias-proxy-address-with-office-365" /><updated>2021-04-20T10:19:21.0000000Z</updated><summary>Sending emails in Microsoft Exchange world using an alias for an account has always been a pain. It required working with workarounds such as setting up Shared Mailbox or Distribution Groups and using SendAs permissions. For years admins around the world were asking Microsoft to change this, and finally, in April 2021, they did! It’s a new feature of Office 365, and it requires action from Office 365 Administrator.</summary><category term="exchange" /><category term="exchange online" /><category term="office 365" /><category term="powershell" /><category term="proxy address" /><category term="sendasalias" /></entry><entry><title>Submitting blogs to web.archive.org using PowerShell</title><id>https://evotec.xyz/blog/submitting-blogs-to-web-archive-org-using-powershell</id><link href="https://evotec.xyz/blog/submitting-blogs-to-web-archive-org-using-powershell" /><updated>2021-03-19T14:23:11.0000000Z</updated><summary>Since my website went down in fire with OVH SBG2, I used this occasion to publish my restored website via Cloudflare. It allows me to have to cache, minimization, and some additional security. One thing that caught my attention while browsing through Cloudflare settings was the Always Online feature based on web.archive.org. Basically, the concept is – whenever the website is down, Cloudflare would go and fetch content from web.archive.org.</summary><category term="archive" /><category term="blogs" /><category term="powershell" /><category term="pswritecolor" /><category term="rss" /><category term="web.archive.org" /><category term="write-color" /></entry><entry><title>Advanced HTML reporting using PowerShell</title><id>https://evotec.xyz/blog/advanced-html-reporting-using-powershell</id><link href="https://evotec.xyz/blog/advanced-html-reporting-using-powershell" /><updated>2021-03-16T17:15:23.0000000Z</updated><summary>I’ve been using HTML reporting in PowerShell for a while. Initially, I would usually build HTML by hand, but the time spent trying to figure out what works and what doesn’t drive me mad. With the PSWriteHTML module, a lot has changed. With just a few PowerShell lines, I can create feature-rich reports that change how I show data to my Clients. Today I wanted to show you some advanced HTML reporting without actually complicating PowerShell code. In the last few months, I’ve added many features that create advanced reports without sacrificing readability.</summary><category term="advanced reporting" /><category term="css" /><category term="html" /><category term="javascript" /><category term="powershell" /><category term="pswritehtml" /><category term="reporting" /></entry><entry><title>Monitoring LDAPS connectivity/certificate with PowerShell</title><id>https://evotec.xyz/blog/monitoring-ldaps-connectivity-certificate-with-powershell</id><link href="https://evotec.xyz/blog/monitoring-ldaps-connectivity-certificate-with-powershell" /><updated>2021-03-02T17:53:05.0000000Z</updated><summary>Some time ago, I wrote a blog post on checking for LDAP, LDAPS, LDAP GC, and LDAPS GC ports with PowerShell. It mostly works, but it requires a tad bit of effort, and it doesn’t cover the full scope that I wanted. Recently (well over 3 years ago), Chris Dent shared some code that verifies the LDAP certificate, and I thought this would be good to update my cmdlets to support just that with a bit of my own magic on top.</summary><category term="active directory" /><category term="ad" /><category term="ldap" /><category term="powershell" /><category term="testimo" /></entry><entry><title>The only command you will ever need to understand and fix your Group Policies (GPO)</title><id>https://evotec.xyz/blog/the-only-command-you-will-ever-need-to-understand-and-fix-your-group-policies-gpo</id><link href="https://evotec.xyz/blog/the-only-command-you-will-ever-need-to-understand-and-fix-your-group-policies-gpo" /><updated>2021-01-24T17:15:04.0000000Z</updated><summary>I’ve been working on cleaning up Group Policies for a couple of months. While it may seem trivial, things get complicated when you’re tasked with managing 5000 GPOs created over 15 years by multiple teams without any best practices in mind. While working on GPOZaurr (my new PowerShell module), I’ve noticed that the more code I wrote to manage those GPOs, the more I knew passing this knowledge to admins who will be executing this on a weekly/monthly basis is going to be a challenge. That’s why I’ve decided to follow a similar approach as my other Active Directory testing module called Testimo. I’ve created a single command that analyses Group Policies using different methods and shows views from different angles to deliver the full picture. On top of that, it provides a solution (or it tries to) so that it’s fairly easy to fix – as long as you agree with what it proposes.</summary><category term="active directory" /><category term="gpo" /><category term="group policy" /><category term="powershell" /></entry><entry><title>Creating Office 365 Migration Diagram with PowerShell</title><id>https://evotec.xyz/blog/creating-office-365-migration-diagram-with-powershell</id><link href="https://evotec.xyz/blog/creating-office-365-migration-diagram-with-powershell" /><updated>2021-01-03T18:27:05.0000000Z</updated><summary>A few weeks ago, I posted a concept migration diagram for Office 365 to Twitter and Facebook. Today I thought I would show you how you can do it yourself using PowerShell and PSWriteHTML PowerShell module. When I started working on this, I’ve thought I want to create before and after infrastructure to see how it will look when migration ends. I’ve initially planned to assign myself an Office 365 Visio Plan 2 license and do something manually, thinking it may be just much easier. Unfortunately for me, there were no free Visio licenses in my tenant, and my laziness took over, so I’ve decided to give it a go using PowerShell only.</summary><category term="diagram" /><category term="module" /><category term="office 365" /><category term="powershell" /><category term="pswritehtml" /></entry><entry><title>Remove-Item : Access to the cloud file is denied while deleting files from OneDrive</title><id>https://evotec.xyz/blog/remove-item-access-to-the-cloud-file-is-denied-while-deleting-files-from-onedrive</id><link href="https://evotec.xyz/blog/remove-item-access-to-the-cloud-file-is-denied-while-deleting-files-from-onedrive" /><updated>2020-12-06T18:07:39.0000000Z</updated><summary>I like OneDrive. It allows me to keep my data secure and always synchronized. If things go wrong, I can always get it back. I use it for almost everything. Even for my PowerShell projects, which are committed to GitHub, so in theory, I shouldn’t need that. But every once in a while, I make some stupid mistake and delete a file that has yet not been committed to GitHub, and that’s where the OneDrive comes in handy. Quick restore, and we’re back. Unfortunately, sometimes things aren’t as I would expect them to work. For example, let’s have a look at this nice list of markdown files that are documentation for my module called GPOZaurr.</summary><category term="delete" /><category term="Office 365" /><category term="onedrive" /><category term="powershell" /><category term="remove-item" /><category term="Windows" /></entry><entry><title>Introducing PSTeams 2.0 – Support for Adaptive Cards, Hero Cards, List Cards and Thumbnail Cards</title><id>https://evotec.xyz/blog/introducing-psteams-2-0-support-for-adaptive-cards-hero-cards-list-cards-and-thumbnail-cards</id><link href="https://evotec.xyz/blog/introducing-psteams-2-0-support-for-adaptive-cards-hero-cards-list-cards-and-thumbnail-cards" /><updated>2020-11-09T17:02:21.0000000Z</updated><summary>PSTeams PowerShell module has been on the market for a while now. It supports sending notifications to Microsoft Teams channels via Incoming WebHooks. You could send a pretty message to the team’s channel with just a few lines of code. With PSTeams 2.0, support for Adaptive Cards, Hero Cards, List Cards, and Thumbnail Cards was added.</summary><category term="microsoft teams" /><category term="office 365" /><category term="powershell" /><category term="reporting" /><category term="webhook" /></entry><entry><title>Visually display Active Directory Trusts using PowerShell</title><id>https://evotec.xyz/blog/visually-display-active-directory-trusts-using-powershell</id><link href="https://evotec.xyz/blog/visually-display-active-directory-trusts-using-powershell" /><updated>2020-09-14T13:44:10.0000000Z</updated><summary>Active Directory Trusts are useful to connect one or more domains. But as useful those are, they can be very dangerous. Also, keeping trusts working and in good shape should be a top priority for Active Directory Admins. While there is a couple of command in the Active Directory module Get-ADTrust, I thought I would try and write my own that checks a few more things. I want to thank Chris Dent for his input on the part of this command. His binary skills amaze me!</summary><category term="Active Directory" /><category term="activedirectory" /><category term="adessentials" /><category term="get-winadtrust" /><category term="powershell" /><category term="pswritehtml" /><category term="show-winadtrust" /></entry><entry><title>Visually display Active Directory Nested Group Membership using PowerShell</title><id>https://evotec.xyz/blog/visually-display-active-directory-nested-group-membership-using-powershell</id><link href="https://evotec.xyz/blog/visually-display-active-directory-nested-group-membership-using-powershell" /><updated>2020-09-02T16:06:48.0000000Z</updated><summary>In the Active Directory PowerShell module, you have two commands to your disposal that help display group membership. Those are Get-ADGroup and Get-ADGroupMember. The first command contains property Members, which gives you DistinguishedName of all members, and Get-ADGroupMember can provide you either direct members or with Recursive switch all members recursively (skipping groups). Till a few weeks ago, I was a happy user of those commands until I noticed two things. Member property for Get-ADGroup sometimes misses elements for whatever reason.</summary><category term="Active Directory" /><category term="adessentials" /><category term="diagram" /><category term="get-adgroup" /><category term="get-adgroupmember" /><category term="nested groups" /><category term="powershell" /><category term="pswritehtml" /></entry></feed>