Adam Bertram

Adam Bertram is a 20+ year veteran of IT and an experienced online business professional. He’s a consultant, Microsoft MVP, blogger, trainer, published author, and content marketer for multiple technology companies.

Automating Docker Container Health Checks with Python and Local Notifications

Docker's built-in health checks are passive—they tell Docker when a container fails, but do they tell you? In this tutorial, we'll build a lightweight Python monitoring system that runs entirely on your infrastructure with zero external dependencies. You'll learn to detect container failures in real-time, send instant alerts, and maintain a complete audit log of every state change.

How to Block Known Bad Active Directory Passwords

In this article, we will explore why and how to block the use of certain passwords for Active Directory user accounts. In an Active Directory environment, password security is a critical factor in protecting user accounts against cyberattacks. However, even with a strict password policy in place, some users or administrators may still choose weak passwords or ones that can be easily guessed. To strengthen the security of your domain, it is possible to prevent the use of specific passwords. If blocking bad Active Directory passwords is part of a larger identity-security learning plan, compare Udemy technical training courses for cloud, development, security, and business software skills before paying for another course library. Why block certain passwords? There are several scenarios in which it is advisable to prevent users or administrators from setting specific passwords. The larger and older an Active Directory environment becomes, the higher the likelihood of poor practices and notable weaknesses. Throughout my career as a pentester, I have conducted numerous internal penetration tests in companies of different sizes, levels of maturity, and industries. In many cases, password reuse across multiple user accounts allowed me to compromise several accounts, including privileged ones, which sometimes led to the complete compromise of the domain. To strengthen security and increase resilience against cyberattacks, it may be necessary to block specific passwords, especially when they arise from the following situations. Common initial password for all accounts A common practice within administration teams is to assign the same initial password (often referred to as a default password) to every new user, with the instruction to change it as soon as possible. A typical example of such a password could be “Welcome2024!”. However, this password change is not always enforced, especially when it is not technically required. In many cases, it is possible to find user accounts still configured with this password even years after their creation, either because they were never used, or because the password change requirement was not applied (e.g., technical accounts, test accounts, or so-called temporary accounts).

Migrating from PowerShell 6 to 7.5: Breaking Changes/New Features

Migrate from PowerShell Core 6 to 7.5: breaking changes, features, and testing tips.

Boost your Active Directory Security with this Free Audit

Scan your Active Directory passwords for strength and find weaknesses with a free Specops audit.

Fortifying the Frontline: Protecting Helpdesks from Social Engineering

Helpdesks are prime targets for social engineering. Specops Secure Service Desk ensures only verified users gain access, stopping attackers at the source.

How to Use Cursor Notepads to Enforce Your Team’s Coding Standards

Learn how to make Cursor's AI generate code that automatically matches your team's style guide using persistent Notepads, eliminating manual cleanup and ensuring consistency.

How to Add Timeouts to Pester Tests with PowerShell Runspaces

Prevent Pester tests from hanging indefinitely using PowerShell runspaces. Learn to handle variable scoping, module loading, TestDrive access, and stream capture challenges with timeout protection.

PowerShell 101: Creating a Module Manifest

Maybe you’ve put together some great functions but struggle to make them cohesive, intuitive, or shareable. Without a way to define your module’s identity and functionality, managing or scaling as your scripts evolve into robust tools can be a headache. Not unless you have a module manifest in place. Think of a module manifest as the backbone of your PowerShell module. In this guide, you’ll learn what a manifest is and how to create one that simplifies management and enhances usability. Prerequisites To follow along with this tutorial, ensure you have: PowerShell 5.1 or PowerShell 7+ installed Administrative access to create files in the PowerShell modules directory A basic PowerShell module (.psm1 file) ready to enhance with a manifest What is a PowerShell Module Manifest? A module manifest is a PowerShell data file (.psd1) that contains metadata about your module. It’s essentially a hashtable that tells PowerShell: Which functions to expose What PowerShell versions are compatible Who created the module and when What dependencies the module requires How the module should behave when imported Without a manifest, PowerShell modules still work but lack professional polish and control. The manifest transforms a collection of scripts into a manageable, versioned package. Creating and Naming a Manifest A manifest file must follow specific naming conventions. Name the manifest file after your module with a .psd1 extension. For example, if your module is named ComputerInventory, the manifest file should be ComputerInventory.psd1. Using New-ModuleManifest While you can create a manifest manually, the New-ModuleManifest cmdlet simplifies the process. Here’s a complete example: New-ModuleManifest -Path 'C:\Program Files\PowerShell\Modules\ComputerInventory\ComputerInventory.psd1' ` -RootModule 'ComputerInventory.psm1' ` -ModuleVersion '1.0.0' ` -Guid (New-Guid).Guid ` -Author 'Your Name' ` -CompanyName 'Your Organization' ` -Description 'A module for collecting computer hardware inventory information' ` -PowerShellVersion '5.1' ` -FunctionsToExport 'Get-MemoryInfo','Get-ProcessorInfo','Get-StorageInfo' ` -CompatiblePSEditions 'Core','Desktop' Understanding the Parameters Path – Where to create the manifest file.

Refactoring with AI: Why “Fix Everything” Is a Terrible Prompt

Transform your AI coding workflow: Learn why asking AI to 'fix everything' fails spectacularly and discover my battle-tested, step-by-step framework for effective AI refactoring that turns chaotic code into clean architecture—without breaking your app.

When a Script is Worth a Thousand AI Prompts

When traditional scripts outshine AI: a developer's journey back to automation basics.

Vibe Coding: How I Built a 120K Line App Without “Learning to Code”

Building real applications with AI isn't just for developers anymore. Here's how I went from PowerShell scripts to a full-stack React/Express app by embracing "vibe coding" with AI.

Creating a Real-World Module: Creating Functions

Learn how to create PowerShell functions that gather memory, storage, and processor information from remote systems, transforming raw output into readable formats.

Creating a Real-World PowerShell Module: Scaffolding Functions

Learn how to create a custom PowerShell module for computer inventory management. This hands-on guide covers module structure, functions, and remote capabilities.

Build a Scalable PowerShell Pester Testing Framework

Learn how to create a maintainable and organized Pester testing framework for PowerShell that scales with your needs. Perfect for large test suites.

PowerShell 101: Creating a Real-World Module: Scaffolding Functions

Learn how to create powerful PowerShell modules from scratch by building a computer inventory tool. Perfect for sysadmins who need custom automation solutions.

PowerShell 101: Finding and Installing New Modules

Learn how to find, install, verify and remove PowerShell modules efficiently. Master module management to enhance your PowerShell automation capabilities.

PowerShell 101: Importing Modules

Learn how to manage PowerShell modules like a pro! From importing and removing modules to troubleshooting common issues, master PowerShell modules in this complete guide.

PowerShell Modules: A Beginner’s Guide to Extending Functionality

Learn how PowerShell modules work, where to find them, and how to use them effectively. Master the building blocks that unlock PowerShell's automation potential.

PowerShell Pester 101: A Practical Guide for Beginners

Learn how to validate your PowerShell scripts with Pester testing. This hands-on guide shows you how to write tests that ensure your code works as intended.

How to Fix PowerShell’s Double-Hop Problem: A Complete Guide

Learn how to overcome PowerShell's double-hop authentication limitation with session configurations. This guide shows you practical solutions for remote access problems.