-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.feed
More file actions
136 lines (136 loc) · 194 KB
/
Copy pathindex.feed
File metadata and controls
136 lines (136 loc) · 194 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
{
"version" : "https://jsonfeed.org/version/1.1",
"title" : "Bearman.NL",
"description": "This is the blog of Mike Beerman. The views and opinions expressed here are only those of the author and do not represent those of any organization or any individual with whom the author may be associated, professionally or personally.",
"home_page_url" : "https://bearman.nl/",
"feed_url" : "https://bearman.nl/index.feed",
"icon" : "https://bearman.nl/apple-touch-icon.png",
"favicon" : "https://bearman.nl/favicon.ico",
"author" : {
"name" : "Mike Beerman",
"url": "https://github.com/bearmannl",
"avatar": "https://bearman.nl/images/bnl_logo-100x100.png"
},
"items" : [
{
"title" : "Sovereignty Scale: A Path to EU Digital Independence",
"date_published" : "2025-04-27T22:00:00+02:00",
"date_modified" : "2025-04-27T22:45:00+02:00",
"id" : "https://bearman.nl/2025/04/27/sovereign-scale/",
"url" : "https://bearman.nl/2025/04/27/sovereign-scale/",
"summary": "\rIntroducing the Sovereignty Scale: A Path to EU Digital IndependenceIn today\u0026rsquo;s digital landscape, the concept of sovereignty has become increasingly important, especially within the European Union (EU). As geopolitical circumstances evolve, there is a growing demand for sovereign cloud and tech solutions that can rival the dominance of Big Tech companies like Amazon, Google, and Microsoft. However, the path to achieving true digital independence is complex and multifaceted. This is where the Sovereignty Scale comes in—a novel concept designed to measure and promote progress towards EU digital sovereignty.\n",
"content_html" : "\u003ch1 id=\"introducing-the-sovereignty-scale-a-path-to-eu-digital-independence\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#introducing-the-sovereignty-scale-a-path-to-eu-digital-independence\" class=\"header-mark\"\u003e\u003c/a\u003eIntroducing the Sovereignty Scale: A Path to EU Digital Independence\u003c/h1\u003e\u003cp\u003eIn today\u0026rsquo;s digital landscape, the concept of sovereignty has become increasingly important, especially within the European Union (EU). As geopolitical circumstances evolve, there is a growing demand for sovereign cloud and tech solutions that can rival the dominance of Big Tech companies like Amazon, Google, and Microsoft. However, the path to achieving true digital independence is complex and multifaceted. This is where the Sovereignty Scale comes in—a novel concept designed to measure and promote progress towards EU digital sovereignty.\u003c/p\u003e\n\u003cp\u003eBefore we dive in, let\u0026rsquo;s first understand what sovereignty means in the literal sense:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u0026ldquo;\u003cem\u003esupreme power or authority\u003c/em\u003e\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;\u003cem\u003ethe authority of a state to govern itself or another state\u003c/em\u003e\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;\u003cem\u003ea self-governing state\u003c/em\u003e\u0026rdquo;\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThese definitions will help us frame a more structured discussion on the subject.\u003c/p\u003e\n\u003ch2 id=\"understanding-the-sovereignty-scale\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#understanding-the-sovereignty-scale\" class=\"header-mark\"\u003e\u003c/a\u003eUnderstanding the Sovereignty Scale\u003c/h2\u003e\u003cp\u003eThe Sovereignty Scale is a framework that rates the sovereignty of an organization\u0026rsquo;s digital systems on a percentage scale from 0% to 100%. This scale helps organizations assess their current level of digital independence, set realistic goals for improvement, and define what needs to be done to meet those goals. Here’s a breakdown of what the percentages mean:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e0%-25%\u003c/strong\u003e: Minimal sovereignty. Organizations in this range are heavily reliant on external providers for their digital infrastructure, software, and services. In this case, another organization is the \u003cem\u003esupreme power of authority\u003c/em\u003e over your organization\u0026rsquo;s digital infrastructure.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e25%-50%\u003c/strong\u003e: Basic data sovereignty. These organizations have taken steps to control access to their data, such as using Bring Your Own Key (BYOK) solutions. This is a middle ground where \u003cem\u003ethe organization has some measure of authority to govern itself\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e50%-75%\u003c/strong\u003e: Infrastructure sovereignty. At this level, organizations have significant control over their data and compute resources, possibly using hybrid or multi-cloud solutions. Still a middle ground, but \u003cem\u003ethe organization has more authority to govern itself\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e75%-100%\u003c/strong\u003e: Full sovereignty. Organizations in this range have complete control over their software, hardware, and services, often utilizing open source solutions and hosting their own data centers. In line with the literal definition, this is where any organization is \u003cem\u003ea self-governing entity\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"weighting-factors\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#weighting-factors\" class=\"header-mark\"\u003e\u003c/a\u003eWeighting Factors\u003c/h3\u003e\u003cp\u003eWhile I personally deal with software applications and platforms the most in my field, the above criteria are applicable to many situations. It will be complicated to declare a specific sovereignty score for everything in an organization.\u003c/p\u003e\n\u003cp\u003eI propose evaluating relevant aspects, such as all your IT solutions at a software level, but not the entire supply chain including who owns the upstream cobalt mine for your technology hardware. Once you have subject matter experts in a single field come up with that score, you could always aggregate scores from different levels. For instance, what is our hardware engineering sovereignty versus our software engineering sovereignty?\u003c/p\u003e\n\u003cp\u003eDifferent components of an organization\u0026rsquo;s digital system may have different weights in the overall sovereignty score. For example, data sovereignty might be more critical for some organizations than hardware sovereignty. Here are some factors to consider when assigning weights:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eData Sovereignty\u003c/strong\u003e: Control over data access and storage.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eInfrastructure Sovereignty\u003c/strong\u003e: Control over compute resources and hosting environments.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSoftware Sovereignty\u003c/strong\u003e: Use of open source software versus proprietary solutions.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHardware Sovereignty\u003c/strong\u003e: Origin and control over hardware components.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe following depiction illustrates how one might conceptually see the scale and the weighting factors:\u003c/p\u003e\n\u003cp\u003e\u003cimg class=\"tw-inline\" loading=\"lazy\" src='/2025/04/27/sovereign-scale/sovereignty-scale.drawio.png' srcset=\"/2025/04/27/sovereign-scale/sovereignty-scale.drawio_hu_13e7d4593c1387bf.webp 800w, /2025/04/27/sovereign-scale/sovereignty-scale.drawio_hu_cf097d8128e6e253.webp 1200w, /2025/04/27/sovereign-scale/sovereignty-scale.drawio_hu_450f3299edbfe9e2.webp 1600w\" alt=\"sovereignty-scale.drawio.png\" height=\"442\" width=\"861\"\u003e\u003c/p\u003e\n\u003ch3 id=\"practical-example-scenario\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#practical-example-scenario\" class=\"header-mark\"\u003e\u003c/a\u003ePractical Example Scenario\u003c/h3\u003e\u003cp\u003eLet\u0026rsquo;s evaluate the sovereignty of the cloud landscape for the fictive company \u0026lsquo;\u003cstrong\u003eDutch Hotels \u0026amp; Restaurants (DHR)\u003c/strong\u003e\u0026rsquo;. This company has several physical hotels across the Netherlands, each including restaurants. They service many clients, communicate internally with staff and externally with customers, process payment information, and follow stringent rules regarding physical safety and security of hotel guests. Their cloud components include:\u003c/p\u003e\n\r\n\u003cdiv class=\"table-wrapper\"\u003e\r\n \u003ctable\u003e\r\n \u003cthead\u003e\r\n \u003ctr\u003e\r\n \u003cth style=\"text-align: \"\u003eProduct\u003c/th\u003e\r\n \u003cth style=\"text-align: \"\u003ePurpose\u003c/th\u003e\r\n \u003cth style=\"text-align: \"\u003eSource\u003c/th\u003e\r\n \u003cth style=\"text-align: \"\u003eSovereignty Score\u003c/th\u003e\r\n \u003c/tr\u003e\r\n \u003c/thead\u003e\r\n \u003ctbody\u003e\r\n \u003ctr\u003e\r\n \u003ctd style=\"text-align: \"\u003eSharePoint (Online)\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003eAdministrative file sharing and storage\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003eClosed Source\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003e10%\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \u003ctr\u003e\r\n \u003ctd style=\"text-align: \"\u003egrommunio (self-hosted)\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003eEmail server\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003eOpen Source\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003e80%\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \u003ctr\u003e\r\n \u003ctd style=\"text-align: \"\u003eMicrosoft Outlook (Desktop client, cloud connections disabled)\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003eEmail client app on Windows\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003eClosed Source\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003e45%\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \u003ctr\u003e\r\n \u003ctd style=\"text-align: \"\u003eAzure Virtual Machines\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003eHosting of the public website, reservations system, and grommunio\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003eClosed Source\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003e30%\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \u003ctr\u003e\r\n \u003ctd style=\"text-align: \"\u003eMicrosoft Teams\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003eInternal communication\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003eClosed Source\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003e10%\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \u003ctr\u003e\r\n \u003ctd style=\"text-align: \"\u003ePostgreSQL Database Servers (On-premises)\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003eHosting of databases with all customer data behind Azure hosted systems\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003eOpen Source\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003e90%\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \u003ctr\u003e\r\n \u003ctd style=\"text-align: \"\u003eSite-to-site VPN\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003eConnectivity between Azure applications and databases on-premises\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003eClosed Source\u003c/td\u003e\r\n \u003ctd style=\"text-align: \"\u003e50%\u003c/td\u003e\r\n \u003c/tr\u003e\r\n \u003c/tbody\u003e\r\n \u003c/table\u003e\r\n\u003c/div\u003e\r\n\u003cp\u003eFor argument\u0026rsquo;s sake, let\u0026rsquo;s evaluate. Averaging it out over those base scores, we get a \u003cstrong\u003e45% sovereignty score\u003c/strong\u003e for the cloud landscape overall.\u003c/p\u003e\n\u003cp\u003eAll personally identifiable information (PII) and payment card numbers are stored in the on-premises databases. So from the need to \u003cem\u003egovern\u003c/em\u003e their customer\u0026rsquo;s data, the 90% sovereignty score for databases hosted on-premises is great. The total 45% sovereignty score in that sense might be \u0026lsquo;just what DHR needs\u0026rsquo;. Similarly, the email server solution ensures all communications with the client are strictly controlled by DHR themselves, even though the servers are located on Azure Virtual Machines.\u003c/p\u003e\n\u003cp\u003eHowever, if this were a major federal government organization, they might need a minimum 50% sovereign score for their purposes. If it concerns a national security organization, then perhaps they might need a minimum 75% or higher. It all depends on the context, every organization must establish their own guidelines based on their strategic goals.\u003c/p\u003e\n\u003cp\u003eThe percentages themselves are arbitrary at this point, as any organization will need to determine how to calculate them in their context. As a general guideline, consider the following aspects for scoring the sovereignty of any digital solution:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eClosed/Inner/Open Source\u003c/li\u003e\n\u003cli\u003eVendor transparency (do they have and publish audit reports?)\u003c/li\u003e\n\u003cli\u003eVendor roadmap (can you influence development with feature requests?)\u003c/li\u003e\n\u003cli\u003eIs the vendor part of your own jurisdiction/region?\u003c/li\u003e\n\u003cli\u003eHas the vendor ever had significant security incidents?\u003c/li\u003e\n\u003cli\u003eDoes the vendor have reputable staff?\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eStarting to tag and label your systems with the relative sovereignty score will allow your organization to make an informed decision on what the total score needs to be (at a strategic level) and to identify which specific components might need changing.\u003c/p\u003e\n\u003cp\u003eThis approach can help bridge the gap in discussions where there is polarization between parties arguing for either going fully private cloud/open source or being fully public cloud with proprietary closed source software. It will help focus the discussion on what you are trying to achieve as a specific goal.\u003c/p\u003e\n\u003ch2 id=\"the-role-of-big-tech-companies\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#the-role-of-big-tech-companies\" class=\"header-mark\"\u003e\u003c/a\u003eThe Role of Big Tech Companies\u003c/h2\u003e\u003cp\u003eIt’s important to acknowledge the significant contributions of Big Tech companies in providing mature and efficient solutions. The goal of the Sovereignty Scale is not to exclude these companies but to find a balanced approach that incorporates open source solutions where relevant to attain your organization\u0026rsquo;s goals.\u003c/p\u003e\n\u003cp\u003eWhile it might seem simple to say, \u0026lsquo;\u003cem\u003elet\u0026rsquo;s swap out all the public cloud systems for private cloud\u003c/em\u003e\u0026rsquo;, it could be an insurmountable task if your organization does not have the maturity to operate a private cloud. Additionally, Big Tech companies have refined the notion of hyperscale data centers. Aiming for 100% sovereignty would require a highly mature organization to operate hyperscale data centers, perhaps even engineering your own chips for the servers and ensuring a completely controlled procurement chain down to the base materials.\u003c/p\u003e\n\u003cp\u003ePick a realistic target and recognize that some (if not all) components might still be fine under Big Tech control, depending on your needs. Perhaps you can use a fully Microsoft Cloud (Microsoft 365/Azure) environment but suffice with just switching over to \u0026lsquo;Bring Your Own Key\u0026rsquo; (BYOK) to have \u0026lsquo;full authority over your own data\u0026rsquo;.\u003c/p\u003e\n\u003cp\u003eTaking incremental steps, such as starting with BYOK and implementing some on-premises servers connected through Azure Arc, can allow your organization to \u0026lsquo;get comfortable\u0026rsquo; with taking sovereign control over your systems while leaning on the substantial enterprise maturity of a Big Tech company like Microsoft.\u003c/p\u003e\n\u003ch2 id=\"hybridmulti-cloud-approach\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#hybridmulti-cloud-approach\" class=\"header-mark\"\u003e\u003c/a\u003eHybrid/Multi-Cloud Approach\u003c/h2\u003e\u003cp\u003eAchieving a balanced approach to sovereignty through hybrid or multi-cloud platforms is not new. Even a decade ago, before sovereignty became a buzzword, it was considered good practice to diversify your organizational portfolio with hybrid and multi-cloud platforms. Organizations can host open source solutions on Big Tech infrastructure, benefiting from the scalability and cost-efficiency of these providers while gradually transitioning to more sovereign solutions. Alternatively, you can have exclusively closed source software and solutions but host them almost exclusively in private data center settings.\u003c/p\u003e\n\u003cp\u003eThis might seem like a return to pre-cloud era operations, but we have learned a lot in IT about operating our systems in a more modern way. It isn\u0026rsquo;t going back if you are taking a different approach to private data centers, for instance, in an agile manner with CI/CD practices that were not prevalent in those days.\u003c/p\u003e\n\u003cp\u003eMost importantly, the context matters. \u003cem\u003eWhy do you want to become more or less sovereign on the sovereignty scale?\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"win-win-scenario\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#win-win-scenario\" class=\"header-mark\"\u003e\u003c/a\u003eWin-Win Scenario\u003c/h2\u003e\u003cp\u003eThe hybrid approach can be a win-win for both EU organizations wanting more authority over their own IT systems and Big Tech companies wanting to offer their mature products and services. Big Tech companies can remain relevant by offering hosting services for open source platforms and contributing to the development of sovereign solutions. This collaboration can help EU organizations take incremental steps towards sovereignty without a complete break from Big Tech. It may be tempting to want \u0026lsquo;a fully sovereign EU cloud\u0026rsquo;, but consider the cost and required maturity to get to that point.\u003c/p\u003e\n\u003cp\u003eProgressing towards having more sovereign control by having EU organizations and Big Tech work hand-in-hand is the most realistic approach, considering all factors involved.\u003c/p\u003e\n\u003ch2 id=\"political-and-economic-considerations\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#political-and-economic-considerations\" class=\"header-mark\"\u003e\u003c/a\u003ePolitical and Economic Considerations\u003c/h2\u003e\u003cp\u003eThe political and economic landscape is constantly evolving. Taking incremental steps towards sovereignty allows organizations to adapt to these changes and ensure long-term digital independence.\u003c/p\u003e\n\u003cp\u003eTargeted discussions on how to move the sovereignty scale forward (or not, if you\u0026rsquo;re good as is) will at least increase the likelihood of it becoming a reality.\u003c/p\u003e\n\u003ch2 id=\"conclusion-and-call-to-action\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#conclusion-and-call-to-action\" class=\"header-mark\"\u003e\u003c/a\u003eConclusion and Call to Action\u003c/h2\u003e\u003cp\u003eThe Sovereignty Scale is a tool to rationalize the discussion around digital independence and make informed decisions. It encourages organizations to consider their current level of sovereignty and set realistic goals for improvement.\u003c/p\u003e\n\u003cp\u003eTo start today:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDefine your strategic organizational goal for sovereignty.\u003c/li\u003e\n\u003cli\u003eAssess your IT landscape by tagging each digital solution with a score.\u003c/li\u003e\n\u003cli\u003eIdentify components for improving their respective scores.\u003c/li\u003e\n\u003cli\u003eWhen selecting improvements or alternatives, consider the required feature parity.\u003c/li\u003e\n\u003cli\u003eStart small and build experience by increasing your sovereignty one component at a time.\u003c/li\u003e\n\u003cli\u003eEvaluate your progress regularly (quarterly/annually) and adjust your goals as needed.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTo any government organization involved in regulating topics such a mandatory data classification I would recommend considering sovereignty classification. The more sovereignty is tagged, the more specifically discussions can be had on the subject.\u003c/p\u003e\n\u003cp\u003eYou are invited to engage with this concept, provide feedback, and share your experiences with sovereign solutions. Together, we can build a more sovereign digital future for the EU.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"stay-tuned\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#stay-tuned\" class=\"header-mark\"\u003e\u003c/a\u003eStay Tuned\u003c/h2\u003e\u003cp\u003eIn the next blog post, we will dive deeper into concrete examples and market references, illustrating how the Sovereignty Scale can be applied in real-world scenarios. We will also provide detailed specifics on how to calculate sovereignty scoring for solutions and system components.\u003c/p\u003e\n",
"language": "en"
},
{
"title" : "PEaC Gen AI Usage",
"date_published" : "2024-10-13T20:50:00+02:00",
"date_modified" : "2024-10-13T21:10:00+02:00",
"id" : "https://bearman.nl/2024/10/13/peac-gen-ai-usage/",
"url" : "https://bearman.nl/2024/10/13/peac-gen-ai-usage/",
"summary": "\rPrompt Engineering as Code: AI Memory Transfer and Reusable Instructions\rIntroductionIn the rapidly evolving field of artificial intelligence, efficiency and consistency are paramount. Borrowing from the successes of methodologies like Infrastructure as Code (IaC) and Documentation as Code (Docs as Code), we can enhance AI interactions by treating prompts and context as code artifacts. This approach introduces two innovative concepts under one banner:\nPrompt Seed: Capturing and transferring AI interaction contexts in code format. Prompt Instruction: Storing and managing prompt templates as reusable code components. By unifying these under the umbrella of Prompt Engineering as Code (PEaC), we can apply best practices from software development to AI prompt management, enabling version control, collaboration, and scalability.\n",
"content_html" : "\u003ch1 id=\"prompt-engineering-as-code-ai-memory-transfer-and-reusable-instructions\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#prompt-engineering-as-code-ai-memory-transfer-and-reusable-instructions\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003ePrompt Engineering as Code: AI Memory Transfer and Reusable Instructions\u003c/strong\u003e\u003c/h1\u003e\u003ch2 id=\"introduction\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#introduction\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eIntroduction\u003c/strong\u003e\u003c/h2\u003e\u003cp\u003eIn the rapidly evolving field of artificial intelligence, efficiency and consistency are paramount. Borrowing from the successes of methodologies like Infrastructure as Code (IaC) and Documentation as Code (Docs as Code), we can enhance AI interactions by treating prompts and context as code artifacts. This approach introduces two innovative concepts under one banner:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003ePrompt Seed\u003c/strong\u003e: Capturing and transferring AI interaction contexts in code format.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePrompt Instruction\u003c/strong\u003e: Storing and managing prompt templates as reusable code components.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eBy unifying these under the umbrella of \u003cstrong\u003ePrompt Engineering as Code (PEaC)\u003c/strong\u003e, we can apply best practices from software development to AI prompt management, enabling version control, collaboration, and scalability.\u003c/p\u003e\n\u003ch2 id=\"1-prompt-seed\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#1-prompt-seed\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003e1. Prompt Seed\u003c/strong\u003e\u003c/h2\u003e\u003ch3 id=\"concept-overview\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#concept-overview\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eConcept Overview\u003c/strong\u003e\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003ePrompt Seed\u003c/strong\u003e involves exporting the AI\u0026rsquo;s current user-specific context into a standardized, code-friendly format (like JSON or Markdown). This \u0026ldquo;seed\u0026rdquo; can be imported by another AI model or instance, allowing it to restore the context and continue the interaction seamlessly. In essence, this would be a memory transfer from one instance to the next, without having to rebuild context over time.\u003c/p\u003e\n\u003ch3 id=\"benefits\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#benefits\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eBenefits\u003c/strong\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eContext Continuity\u003c/strong\u003e: Transfer your personalized AI experience across different models or accounts.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVersion Control\u003c/strong\u003e: Use Git repositories to track changes to your AI context over time.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCollaboration\u003c/strong\u003e: Share context seeds with team members to align AI interactions.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBackup and Restore\u003c/strong\u003e: Safeguard your AI settings and preferences against data loss.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"parameterization\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#parameterization\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eParameterization\u003c/strong\u003e\u003c/h3\u003e\u003cp\u003eJust as in IaC, thing like sensitive data, personally identifiable information (PII), and secrets should be parameterized. This involves replacing sensitive parts of the context seed with placeholders (parameters) that can be injected when needed. This can also be used to pass along parameters that change at deployment time, like specifics for different AI models. By doing so:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe core context template remains reusable and safe to share.\u003c/li\u003e\n\u003cli\u003eSensitive information is only introduced during the interaction or deployment.\u003c/li\u003e\n\u003cli\u003eYou can use tokenization or environment-based secrets to keep data secure.\u003c/li\u003e\n\u003cli\u003eYou can modularize the context template to take specific instructions for different models like going from Open AI to Claude for example.\u003c/li\u003e\n\u003cli\u003eVersioning can also be used to adapt the context to specific model versions.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"implementation\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#implementation\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eImplementation\u003c/strong\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eStandardized Format\u003c/strong\u003e: Define a schema for the context data (e.g., YAML, JSON).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eExport/Import Tools\u003c/strong\u003e: Develop scripts or use existing tools to serialize and deserialize the AI context.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSecurity Measures\u003c/strong\u003e: Encrypt sensitive information and parameterize sensitive data within the context seed.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eIntegration with Version Control\u003c/strong\u003e: Store context files in repositories for change tracking and collaboration.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"use-case-example\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#use-case-example\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eUse Case Example\u003c/strong\u003e\u003c/h3\u003e\u003cp\u003eA user switches from one AI platform to another. By exporting their context seed from the old platform and importing it into the new one, they retain personalized settings, preferences, and interaction history. Sensitive information, such as authentication tokens or private preferences, can be parameterized and safely injected during deployment.\u003c/p\u003e\n\u003ch2 id=\"2-prompt-instruction\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#2-prompt-instruction\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003e2. Prompt Instruction\u003c/strong\u003e\u003c/h2\u003e\u003ch3 id=\"concept-overview-1\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#concept-overview-1\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eConcept Overview\u003c/strong\u003e\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003ePrompt Instruction\u003c/strong\u003e focuses on creating, storing, and managing AI prompts as code artifacts. By treating prompts like code, users can apply software development practices to improve and reuse them efficiently.\u003c/p\u003e\n\u003cp\u003e\u003cimg class=\"tw-inline\" loading=\"lazy\" src='/2024/10/13/peac-gen-ai-usage/peac-flow.jpg' srcset=\"/2024/10/13/peac-gen-ai-usage/peac-flow_hu_ea90206b43e094d.webp 800w, /2024/10/13/peac-gen-ai-usage/peac-flow_hu_5142b1d1655b2a77.webp 1200w, /2024/10/13/peac-gen-ai-usage/peac-flow_hu_cb086593ebb0a96d.webp 1600w\" alt=\"peac-flow\" height=\"1024\" width=\"1792\"\u003e\u003c/p\u003e\n\u003ch3 id=\"benefits-1\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#benefits-1\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eBenefits\u003c/strong\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eReusability\u003c/strong\u003e: Develop a library of prompts that can be reused across projects.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eConsistency\u003c/strong\u003e: Ensure uniformity in AI interactions within a team or organization.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCollaboration\u003c/strong\u003e: Share and improve prompts collaboratively using version control systems.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAutomation\u003c/strong\u003e: Integrate prompts into scripts and workflows for automated AI tasks.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVersioning\u003c/strong\u003e: Integrating versioning into the prompts will allow tailoring of prompt instructions to specific models, to avoid breaking changes.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"parameterization-1\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#parameterization-1\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eParameterization\u003c/strong\u003e\u003c/h3\u003e\u003cp\u003ePrompts can be parameterized by using placeholders that are filled during execution. This allows for greater flexibility and adaptability:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eDynamic Prompts\u003c/strong\u003e: Replace key parts of a prompt with parameters that are filled based on user input or deployment context.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePipeline Integration\u003c/strong\u003e: Parameters can be injected through automated pipelines, similar to how environment variables are used in software deployment.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"implementation-1\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#implementation-1\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eImplementation\u003c/strong\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTemplate Creation\u003c/strong\u003e: Write prompts in code files with placeholders for dynamic content.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVersion Control\u003c/strong\u003e: Use Git to manage changes, branches, and merges of prompt templates.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDocumentation\u003c/strong\u003e: Comment and document prompts for clarity and ease of use.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eIntegration Tools\u003c/strong\u003e: Develop or use plugins to insert prompts directly into AI interfaces from code repositories. This might be achieved through (YAML) pipelines.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"use-case-example-1\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#use-case-example-1\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eUse Case Example\u003c/strong\u003e\u003c/h3\u003e\u003cp\u003eA team frequently needs to generate PowerPoint presentation outlines. By creating a well-crafted prompt template stored in a repository, any team member can quickly generate outlines by using the template, ensuring efficiency and consistency. Parameterized sections of the prompt can be filled by team members based on specific presentation topics or target audiences.\u003c/p\u003e\n\u003ch2 id=\"3-unified-concept-prompt-engineering-as-code-peac\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#3-unified-concept-prompt-engineering-as-code-peac\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003e3. Unified Concept: Prompt Engineering as Code (PEaC)\u003c/strong\u003e\u003c/h2\u003e\u003ch3 id=\"rationale\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#rationale\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eRationale\u003c/strong\u003e\u003c/h3\u003e\u003cp\u003eCombining both concepts under \u003cstrong\u003ePrompt Engineering as Code\u003c/strong\u003e creates a comprehensive framework for managing AI interactions. PEaC emphasizes the importance of treating both the AI\u0026rsquo;s context and the prompts we use as code artifacts that can be versioned, shared, and improved upon.\u003c/p\u003e\n\u003ch3 id=\"key-principles\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#key-principles\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eKey Principles\u003c/strong\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eModularity\u003c/strong\u003e: Break down prompts and contexts into reusable components.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eStandardization\u003c/strong\u003e: Use consistent formats and schemas for prompts and context seeds.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCollaboration\u003c/strong\u003e: Leverage platforms like GitHub or GitLab for sharing and collaborative development.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAutomation\u003c/strong\u003e: Integrate with CI/CD pipelines for automated testing and deployment of prompts.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eParameterization\u003c/strong\u003e: Securely manage sensitive information through tokenization and parameter injection.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"4-applying-best-practices-from\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#4-applying-best-practices-from\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003e4. Applying Best Practices from \u0026ldquo;as Code\u0026rdquo; Methodologies\u003c/strong\u003e\u003c/h2\u003e\u003ch3 id=\"version-control\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#version-control\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eVersion Control\u003c/strong\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eBranching Strategies\u003c/strong\u003e: Use feature branches for prompt development and merge them after review.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCommit Messages\u003c/strong\u003e: Write clear messages to document changes in prompts or context seeds.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePull Requests\u003c/strong\u003e: Review changes collaboratively to maintain quality.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"testing\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#testing\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eTesting\u003c/strong\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eAutomated Testing\u003c/strong\u003e: Develop scripts to test prompts with different inputs and validate outputs.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eContinuous Integration\u003c/strong\u003e: Integrate testing into the CI pipeline to catch issues early.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRelease Stages\u003c/strong\u003e: Employ stages to validate prompt code changes in different environments before release them to production agents.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"documentation\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#documentation\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eDocumentation\u003c/strong\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eInline Comments\u003c/strong\u003e: Document the purpose and usage of prompts within the code.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eREADME Files\u003c/strong\u003e: Provide overviews and instructions in repository README files.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eChange Logs\u003c/strong\u003e: Maintain logs to track significant updates or changes.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"security\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#security\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eSecurity\u003c/strong\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eAccess Control\u003c/strong\u003e: Restrict repository access to authorized users.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSensitive Data Handling\u003c/strong\u003e: Parameterize sensitive information and inject it during execution.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCompliance\u003c/strong\u003e: Ensure practices comply with data protection regulations (e.g., GDPR).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"5-potential-challenges-and-solutions\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#5-potential-challenges-and-solutions\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003e5. Potential Challenges and Solutions\u003c/strong\u003e\u003c/h2\u003e\u003ch3 id=\"challenge-1-model-compatibility\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#challenge-1-model-compatibility\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eChallenge 1: Model Compatibility\u003c/strong\u003e\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003eIssue\u003c/strong\u003e: Different AI models may interpret prompts or context seeds differently.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution\u003c/strong\u003e: Establish compatibility layers or adapters for different AI models, or maintain model-specific branches of prompts and contexts. Potentially use parameters to this end as well.\u003c/p\u003e\n\u003ch3 id=\"challenge-2-privacy-concerns\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#challenge-2-privacy-concerns\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eChallenge 2: Privacy Concerns\u003c/strong\u003e\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003eIssue\u003c/strong\u003e: Storing user contexts may expose personal data.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution\u003c/strong\u003e: Implement data anonymization and encryption. Parameterize sensitive information and obtain necessary consents. Storing secrets in code is a well known bad practice.\u003c/p\u003e\n\u003ch3 id=\"challenge-3-community-adoption\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#challenge-3-community-adoption\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eChallenge 3: Community Adoption\u003c/strong\u003e\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003eIssue\u003c/strong\u003e: Gaining widespread acceptance for the methodology.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution\u003c/strong\u003e: Demonstrate value through case studies, encourage open-source contributions, and provide easy-to-use tools.\u003c/p\u003e\n\u003ch2 id=\"6-conclusion\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#6-conclusion\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003e6. Conclusion\u003c/strong\u003e\u003c/h2\u003e\u003cp\u003e\u003cstrong\u003ePrompt Engineering as Code\u003c/strong\u003e represents a significant step forward in managing AI interactions. By applying proven software development practices, we can enhance efficiency, promote collaboration, and ensure consistency in how we interact with AI systems.\u003c/p\u003e\n\u003cp\u003eBefore this concept can be brought to its \u003cem\u003epeak\u003c/em\u003e, the following steps are still needed:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eExperimentation\u003c/strong\u003e: By exporting AI context and creating prompt templates, and continually evolving their efficacy.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTool Development\u003c/strong\u003e: Develop or contribute to tools that facilitate PEaC practices.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCommunity Engagement\u003c/strong\u003e: Sharing experiences and improvements with the community to really consolidate the practice in the field of prompt engineering.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAs soon as I have a working example of the concept I will upload it to my GitHub as a follow-up to this post!\u003c/p\u003e\n",
"language": "en"
}
{
"title" : "Generation GovTech",
"date_published" : "2024-09-08T11:00:00+02:00",
"date_modified" : "2024-09-08T11:15:00+02:00",
"id" : "https://bearman.nl/2024/09/08/generation-govtech/",
"url" : "https://bearman.nl/2024/09/08/generation-govtech/",
"summary": "\rGeneration GovTech\rIntroductionThis post introduces a new term, Generation GovTech, or GenGT for short.\nYou\u0026rsquo;ll find a full description of this term below. To explain it fully, we\u0026rsquo;ll first cover the recruitment campaign by the Dutch Ministry of Defense: Generation D\nGeneration DIn 2022, the MoD launched the recruitment campaign Generation D. The campaign aimed to attract people with a specific mindset. This mindset includes individuals who want to do meaningful work, believe in cooperation, and seek personal growth.\n",
"content_html" : "\u003ch1 id=\"generation-govtech\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#generation-govtech\" class=\"header-mark\"\u003e\u003c/a\u003eGeneration GovTech\u003c/h1\u003e\u003ch2 id=\"introduction\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#introduction\" class=\"header-mark\"\u003e\u003c/a\u003eIntroduction\u003c/h2\u003e\u003cp\u003eThis post introduces a new term, Generation GovTech, or GenGT for short.\u003c/p\u003e\n\u003cp\u003eYou\u0026rsquo;ll find a full description of this term below. To explain it fully, we\u0026rsquo;ll first cover the recruitment campaign by the Dutch Ministry of Defense: \u003ca href=\"https://werkenbijdefensie.nl/generatie-d\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGeneration D\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"generation-d\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#generation-d\" class=\"header-mark\"\u003e\u003c/a\u003eGeneration D\u003c/h3\u003e\u003cp\u003eIn 2022, the MoD launched the \u003ca href=\"https://www.defensie.nl/actueel/nieuws/2022/04/20/wervingscampagne-richt-zich-op-generatie-d\" target=\"_blank\" rel=\"noopener noreferrer\"\u003erecruitment campaign Generation D\u003c/a\u003e. The campaign aimed to attract people with a specific mindset. This mindset includes individuals who want to do meaningful work, believe in cooperation, and seek personal growth.\u003c/p\u003e\n\u003cp\u003eThe campaign\u0026rsquo;s core principle is admirable. In 2023, it \u003ca href=\"https://www.defensie.nl/actueel/nieuws/2023/11/17/defensie-wint-effie-award-met-arbeidsmarktcampagne-generatie-d\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ewon the Effie award\u003c/a\u003e for its strong message of a shared mindset. The numbers showed a 71% increase in web traffic and a 30% rise in job applications.\u003c/p\u003e\n\u003cp\u003eThe campaign is worth examining due to its strong message, regardless of the Defense department context. It unifies people with a common goal. The impressive numbers highlight why the concept is compelling.\u003c/p\u003e\n\u003cp\u003eInitially aimed at young adults, the campaign has become a mindset not tied to age. It inspires anyone to work towards a common goal. This serves as a jumping-off point for Generation GovTech.\u003c/p\u003e\n\u003ch3 id=\"govtech\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#govtech\" class=\"header-mark\"\u003e\u003c/a\u003eGovTech\u003c/h3\u003e\u003cp\u003eGovTech describes technological initiatives and innovations within the government sector. Unlike Generation D, it wasn\u0026rsquo;t conceived as a mindset. However, it embodies core principles such as:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eCitizen-Centric Technology Solutions\u003c/strong\u003e: Delivering technology solutions that improve citizens\u0026rsquo; experiences and needs.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eInnovation in Public Services\u003c/strong\u003e: Embracing digital transformation to enhance public services.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTech-Savvy Mindset\u003c/strong\u003e: Attracting public service professionals to a community of tech-savvy peers.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eGovTech gained traction around 2016, \u003ca href=\"https://www.govocal.com/blog/whats-difference-civic-tech-govtech\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eovertaking the term Civic Tech\u003c/a\u003e. This shift is linked to the rebranding of the \u003ca href=\"https://en.wikipedia.org/wiki/Government_Technology_Agency\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGovernment Technology Agency in Singapore\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIn the Netherlands, \u003ca href=\"https://govtechglobal.org/govtech-nl\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGovTech NL was launched in 2018\u003c/a\u003e by the Dutch Ministry of the Interior and Kingdom Relations. It is now part of the \u003ca href=\"https://govtechglobal.org/aboutus\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eGovTech Global Alliance\u003c/a\u003e, which rebranded from The Civtech Alliance.\u003c/p\u003e\n\u003cp\u003eIn 2021, the City of The Hague and the Ministry of the Interior and Kingdom Relations \u003ca href=\"https://www.government.nl/documents/reports/2021/06/30/govtech-in-the-netherlands\" target=\"_blank\" rel=\"noopener noreferrer\"\u003epublished a report\u003c/a\u003e on GovTech in the Netherlands. The report shows how the Netherlands fosters partnerships between innovators and public authorities, a trend named \u0026lsquo;GovTech.\u0026rsquo;\u003c/p\u003e\n\u003cp\u003eTo achieve better partnerships between innovators and public authorities, we need cultural change. While organizations need to change, it is the people who make this happen.\u003c/p\u003e\n\u003ch3 id=\"ecosystems--mindset\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#ecosystems--mindset\" class=\"header-mark\"\u003e\u003c/a\u003eEcosystems \u0026amp; Mindset\u003c/h3\u003e\u003cp\u003eTo wrap up this introduction, people need to adopt a common mindset. Innovators can lead in adopting the GovTech mindset, but the goal is to establish better partnerships between innovators and public authorities.\u003c/p\u003e\n\u003cp\u003eInstead of adopting this mindset one \u0026lsquo;customer \u0026amp; vendor\u0026rsquo; relationship at a time, we should work towards the entire ecosystem around public authorities. As more ecosystem members adopt the GovTech mindset, we shape a generation where GovTech is the common mindset.\u003c/p\u003e\n\u003ch2 id=\"adoption-of-generation-govtech\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#adoption-of-generation-govtech\" class=\"header-mark\"\u003e\u003c/a\u003eAdoption of Generation GovTech\u003c/h2\u003e\u003cp\u003eAdopting the Generation GovTech mindset has transformative potential. By focusing on citizen-centric public services, creating a transparent ecosystem, and advocating for change, we can unify people around this mindset.\u003c/p\u003e\n\u003cp\u003eTo instigate this change, I propose the following actions as our common roadmap to make GovTech even more successful.\u003c/p\u003e\n\u003ch3 id=\"1-vision-and-goals\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#1-vision-and-goals\" class=\"header-mark\"\u003e\u003c/a\u003e1. Vision and Goals\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eVision\u003c/strong\u003e: Generation GovTech stands for innovation, efficiency, transparency, and citizen-centric services in public services.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGoals\u003c/strong\u003e: Inspire people to adopt this mindset and advocate for it within the public services space.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"2-engaging-stakeholders\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#2-engaging-stakeholders\" class=\"header-mark\"\u003e\u003c/a\u003e2. Engaging Stakeholders\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eEngage Key Players\u003c/strong\u003e: Involve public authorities and technology vendors. Form a coalition of champions passionate about GovTech.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"3-culture-of-innovation\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#3-culture-of-innovation\" class=\"header-mark\"\u003e\u003c/a\u003e3. Culture of Innovation\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eExperiential Learning\u003c/strong\u003e: Deliver often, fail safely, and learn by doing. Create safe spaces for innovation.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEducation and Training\u003c/strong\u003e: Provide adequate support at all levels to enable innovation.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"4-inspire-and-share-success\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#4-inspire-and-share-success\" class=\"header-mark\"\u003e\u003c/a\u003e4. Inspire and Share Success\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eLead by Example\u003c/strong\u003e: Celebrate success and inspire people to unify under the GovTech mindset.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"5-work-with-iterative-steps\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#5-work-with-iterative-steps\" class=\"header-mark\"\u003e\u003c/a\u003e5. Work with Iterative Steps\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eAgile Practices\u003c/strong\u003e: Demonstrate success in incremental steps. Show iterative success at a rapid pace. Make Generation GovTech part of daily practice.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"6-continuous-improvement\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#6-continuous-improvement\" class=\"header-mark\"\u003e\u003c/a\u003e6. Continuous Improvement\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRegular Reviews\u003c/strong\u003e: Regularly review and refine strategies. High-paced innovation requires frequent reviews.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"7-build-a-community\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#7-build-a-community\" class=\"header-mark\"\u003e\u003c/a\u003e7. Build a Community\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eEstablish Networks\u003c/strong\u003e: Create networks within the ecosystem. Encourage cross-department and cross-sector collaboration. Public authorities and technology vendors should promote innovation and share success stories.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"conclusion\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#conclusion\" class=\"header-mark\"\u003e\u003c/a\u003eConclusion\u003c/h2\u003e\u003cp\u003eGeneration GovTech represents a transformative mindset for public services. By adopting this mindset, we can create a transparent, innovative, and citizen-centric ecosystem. Engaging stakeholders, fostering a culture of innovation, and working iteratively will drive this change. Continuous improvement and community building are essential to sustain this transformation. Together, we can shape a generation where GovTech is the common mindset, leading to better public services and stronger partnerships between innovators and public authorities.\u003c/p\u003e\n",
"language": "en"
},
{
"title" : "Co Source - Renamed Source Code Sharing Strategy",
"date_published" : "2024-07-21T12:00:00+02:00",
"date_modified" : "2024-07-21T13:21:00+02:00",
"id" : "https://bearman.nl/2024/07/21/co-source-renaming/",
"url" : "https://bearman.nl/2024/07/21/co-source-renaming/",
"summary": "\rCo source\rIntro\rProtected Inner Source RecapProtected Inner Source is a source code sharing strategy that defines an intermediate model between Open Source and Inner Source. The analogy used here is that C# Access Modifiers define a \u0026lsquo;Protected Internal Class\u0026rsquo; as an intermediate between \u0026lsquo;Public Class\u0026rsquo; and \u0026lsquo;Internal Class\u0026rsquo;. The purpose of which is to be more closed off between assemblies than \u0026lsquo;Public Class\u0026rsquo;, yet more open for reuse than \u0026lsquo;Internal Class\u0026rsquo;.\n",
"content_html" : "\u003ch1 id=\"co-source\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#co-source\" class=\"header-mark\"\u003e\u003c/a\u003eCo source\u003c/h1\u003e\u003ch2 id=\"intro\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#intro\" class=\"header-mark\"\u003e\u003c/a\u003eIntro\u003c/h2\u003e\u003ch3 id=\"protected-inner-source-recap\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#protected-inner-source-recap\" class=\"header-mark\"\u003e\u003c/a\u003eProtected Inner Source Recap\u003c/h3\u003e\u003cp\u003eProtected Inner Source is a source code sharing strategy that defines an intermediate model between Open Source and Inner Source. The analogy used here is that \u003ca href=\"https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers#summary-table\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eC# Access Modifiers\u003c/a\u003e define a \u0026lsquo;Protected Internal Class\u0026rsquo; as an intermediate between \u0026lsquo;Public Class\u0026rsquo; and \u0026lsquo;Internal Class\u0026rsquo;. The purpose of which is to be more closed off between assemblies than \u0026lsquo;Public Class\u0026rsquo;, yet more open for reuse than \u0026lsquo;Internal Class\u0026rsquo;.\u003c/p\u003e\n\u003cp\u003eIf you would like to read the previous article, please find it here: \u003ca href=\"/2024/06/20/open-inner-protected-source/\" rel=\"\"\u003eOpen Source - Inner Source - Protected Inner Source\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"source-code-sharing-strategies\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#source-code-sharing-strategies\" class=\"header-mark\"\u003e\u003c/a\u003eSource Code Sharing Strategies\u003c/h2\u003e\u003cp\u003eSo what are source code sharing strategies anyway? Glad you asked! \u0026#x1f447;\u003c/p\u003e\n\u003cp\u003eSource code sharing strategies refer to the various methods and practices used to distribute and collaborate on software code. These strategies determine who can access the code, how it can be modified, and the level of transparency involved. Understanding these strategies is crucial for organizations to effectively manage their software development processes and foster collaboration \u0026#x1f91d; \u0026amp; innovation \u0026#x1f4a1;.\u003c/p\u003e\n\u003ch3 id=\"types-of-source-code-sharing-strategies\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#types-of-source-code-sharing-strategies\" class=\"header-mark\"\u003e\u003c/a\u003eTypes of Source Code Sharing Strategies\u003c/h3\u003e\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eOpen Source\u003c/strong\u003e: This strategy allows anyone to view, modify, and distribute the code. It promotes transparency and community collaboration. Popular examples include Linux and Apache. More about Open Source can be found \u003ca href=\"https://en.wikipedia.org/wiki/Open-source-software_movement\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehere on Wikipedia\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eInner Source\u003c/strong\u003e: Inner Source applies Open Source practices within an organization. It enables teams to collaborate across departmental boundaries while keeping the code private to the organization. This approach enhances code quality and innovation by leveraging internal expertise. More about Inner Source can be found \u003ca href=\"https://en.wikipedia.org/wiki/Inner_source\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehere on Wikipedia\u003c/a\u003e or \u003ca href=\"https://github.com/resources/articles/software-development/innersource\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehere on GitHub\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eClosed Source\u003c/strong\u003e: Also known as proprietary software, this strategy restricts access to the source code. Only authorized individuals or teams within the organization can view or modify the code. This approach is often used to protect intellectual property and maintain control over the software. How Closed Source compares to Open Source is described in further detail \u003ca href=\"https://en.wikipedia.org/wiki/Comparison_of_open-source_and_closed-source_software\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehere on Wikipedia\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u0026#x1f680; \u003cstrong\u003eCo Source\u003c/strong\u003e \u0026#x1f680;: The newly proposed hybrid strategy that allows sharing among certain trusted (or federated) organizations. These organizations operate independently but share a common \u0026#x1f91d; trust boundary \u0026#x1f91d;, similar to how Protected Internal classes work in C#. This strategy promotes collaboration \u003cem\u003ewithout specifically touching on security within the OSS space\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eEach of these strategies has its own set of benefits and challenges, and the choice of strategy depends on the specific needs and goals of the organization.\u003c/p\u003e\n\u003cp\u003eFor a more detailed overview of source code and its management, you can refer to the \u003ca href=\"https://en.wikipedia.org/wiki/Source_code\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eWikipedia page on Source Code\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"name-change-to-co-source\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#name-change-to-co-source\" class=\"header-mark\"\u003e\u003c/a\u003eName Change to Co Source\u003c/h3\u003e\u003ch2 id=\"co-source-reintroduction\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#co-source-reintroduction\" class=\"header-mark\"\u003e\u003c/a\u003eCo Source Reintroduction\u003c/h2\u003e\u003cp\u003eI received feedback on the name \u0026lsquo;\u003cem\u003eProtected\u003c/em\u003e Inner Source\u0026rsquo;. It was mentioned that the label \u003cem\u003eprotected\u003c/em\u003e seemed to imply Open Source and Inner Source are not secure \u0026#x1f512;. This was and is not the intent!\u003c/p\u003e\n\u003cp\u003eIn order to come up with a better name I had considered Federated Source, Trusted Source, Collaborative Source, Cooperative Source\u0026hellip; and have decided on Co Source. The term \u0026lsquo;Co\u0026rsquo; suggests both collaboration and cooperation, which aligns well with the idea of shared source code among trusted entities. It also keeps it clean and neat in daily use \u0026#x1f604;\u003c/p\u003e\n\u003cp\u003eIn the modern world of IT, many aspects of our industry are being changed by rapidly evolving (software) engineering innovations. The pace at which this happens has been impacted by Open Source ways of working, among others. What has become clear, is that these ways of working can have a drastic impact on the ability to innovate in any system.\u003c/p\u003e\n\u003cp\u003eIn bridging organizational design (often business driven) and systems design (often technology driven), Co Source can help bring many benefits. Innovation can benefit especially much, as a core pillar behind the ability for organizations to change. It can drive organizations to change their culture in a way that makes them able to stay ahead of the curve. Competitive advantage driven by a culture of technological innovation.\u003c/p\u003e\n\u003cp\u003eEspecially within organizations that do not have IT as their core business, it can be hard to adopt such a culture. Still, even for strictly business driven organizations it brings massive benefits. As Cloud has shown us in the past 10+ years, and as (Gen) AI keeps showing in the past 1-2 years, the impact is profound.\u003c/p\u003e\n\u003cp\u003eTo those organizations that struggle to adopt these technology driven cultural changes, I would advise to consider enabling a culture around Open Source ways of working. Why? It enables individuals within those organizations with the freedom to demonstrate the benefits with concrete delivery of added value through innovation.\u003c/p\u003e\n\u003cp\u003eAs more individuals in the organizations demonstrate added value and potentially massive impact on the bottom line, a platform of cultural growth is born.\u003c/p\u003e\n\u003cp\u003eDoes that mean the Open Source ways of working need to be adopted specifically in that form? No, this is exactly why Inner Source was conceived to begin with.\u003c/p\u003e\n\u003cp\u003eNow to the point of Co Source. Organizations that have complex but trusted ecosystems such as government organizations, you can gain traction at an accelerated rate beyond what Inner Source enables \u003cem\u003ewithin a single organization\u003c/em\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEnable a cultural shift towards one of technology innovation.\u003c/li\u003e\n\u003cli\u003eSee demonstrated added value through delivery of early innovation scenarios.\u003c/li\u003e\n\u003cli\u003eScale this process by embracing the success of this \u003cem\u003ewave of success\u003c/em\u003e through technology innovation culture.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"security-implications-or-not\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#security-implications-or-not\" class=\"header-mark\"\u003e\u003c/a\u003eSecurity Implications (or not)\u003c/h2\u003e\u003cp\u003eTo reiterate, Protected Inner Source was not meant to imply Open Source is not secure. There are security challenges as with any strategy, and those can be managed in accordance with the relevant situation. Similarly, Co Source should still leverage best practices and proper design thinking to determine what works best when implementing this strategy.\u003c/p\u003e\n\u003ch3 id=\"open-source-and-inner-source-security-best-practices\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#open-source-and-inner-source-security-best-practices\" class=\"header-mark\"\u003e\u003c/a\u003eOpen Source and Inner Source Security Best Practices\u003c/h3\u003e\u003cp\u003eAs Co Source was introduced to introduce a new way of working within certain organizations or ecosystems, I will gladly refer to existing best practices in the OSS Security space. For instance, review the \u003ca href=\"https://openssf.org/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eOpenSSF\u003c/a\u003e article on \u003ca href=\"https://en.wikipedia.org/wiki/Comparison_of_open-source_and_closed-source_software\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eStrengthening Open Source Software: Best Practices for Enhanced Security\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"example-and-applications\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#example-and-applications\" class=\"header-mark\"\u003e\u003c/a\u003eExample and Applications\u003c/h2\u003e\u003cp\u003eAs a specialist in #GovTech, I am primarily fueled by a vision of rapidly accelerating innovation in the public sector. Within the public sector, in any single nation like the United States or group of nations like the European Union, there are massive potential gains to be made by increased collaboration. Embracing the culture of technological innovation is at least one avenue towards to rapidly accelerate towards those potential gains.\u003c/p\u003e\n\u003cp\u003eHow would this work? From any group of government organizations, setup collaboration through Co Source repositories and start demonstrating added value. Not just added value for the (government) organizations, but also to the citizens these organizations serve.\u003c/p\u003e\n\u003cp\u003eEven competing IT vendors working within the public sector can embrace the concept of \u003ca href=\"https://en.wikipedia.org/wiki/Coopetition\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eCoopetition\u003c/a\u003e through Co Source. In doing so, we all improve the impact the public sector has on society as a whole.\u003c/p\u003e\n\u003ch2 id=\"conclusion\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#conclusion\" class=\"header-mark\"\u003e\u003c/a\u003eConclusion\u003c/h2\u003e\u003cp\u003eCo Source has the potential to revolutionize collaborative development within an ecosystem of trusted organizations. By combining the innovative nature of Open Source with the organizational boundaries of Inner Source, Co Source offers a unique model that can be particularly beneficial for government organizations in the public sector. This approach allows these organizations to share resources efficiently and securely, fostering a culture of collaboration and innovation.\u003c/p\u003e\n\u003cp\u003eIn a world where ecosystems are becoming increasingly prominent, Co Source enables organizations to build upon trusted relationships in source code sharing strategies. By establishing a culture of collaboration \u0026#x1f91d; and innovation \u0026#x1f4a1;, organizations can drive technological advancements and achieve significant benefits. Embrace Co Source to unlock the full potential of collaborative development and propel your organization towards a future of innovation \u0026#x1f680;!\u003c/p\u003e\n",
"language": "en"
},
{
"title" : "Open Source - Inner Source - Protected Inner Source",
"date_published" : "2024-06-20T21:30:00+02:00",
"date_modified" : "2024-06-21T01:09:00+02:00",
"id" : "https://bearman.nl/2024/06/20/open-inner-protected-source/",
"url" : "https://bearman.nl/2024/06/20/open-inner-protected-source/",
"summary": "\rProtected Inner SourceUPDATE: Based on feedback, I am changing the name of this source code sharing strategy to \u0026lsquo;Co Source\u0026rsquo;. The direct analogy between Protected Internal Class and Protected Inner Source seemed to imply a lack of security in traditional Open Source sharing strategies, which was not my intent. Read more about the naming change in my follow-up article here: Co Source - Renamed Source Code Sharing Strategy\nIntro\rInner sourceIn the digital era, software development is a cornerstone of innovation. Inner Source has gained traction in this domain. It is a strategy that applies Open Source practices within an organization. Unlike Open Source, Inner Source is not public. It remains confined to a single organization. This approach encourages collaborative software development. Teams across the organization can contribute, regardless of departmental boundaries. Inner Source fosters a culture of transparency and shared responsibility. It leads to improved code quality and accelerated innovation. By leveraging Inner Source, companies can harness the collective expertise of their employees. They can do so while protecting proprietary code.\n",
"content_html" : "\u003ch1 id=\"protected-inner-source\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#protected-inner-source\" class=\"header-mark\"\u003e\u003c/a\u003eProtected Inner Source\u003c/h1\u003e\u003cp\u003eUPDATE: Based on feedback, I am changing the name of this source code sharing strategy to \u0026lsquo;Co Source\u0026rsquo;. The direct analogy between Protected Internal Class and Protected Inner Source seemed to imply a lack of security in traditional Open Source sharing strategies, which was not my intent. Read more about the naming change in my follow-up article here: \u003ca href=\"/2024/07/21/co-source-renaming/\" rel=\"\"\u003eCo Source - Renamed Source Code Sharing Strategy\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"intro\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#intro\" class=\"header-mark\"\u003e\u003c/a\u003eIntro\u003c/h2\u003e\u003ch3 id=\"inner-source\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#inner-source\" class=\"header-mark\"\u003e\u003c/a\u003eInner source\u003c/h3\u003e\u003cp\u003eIn the digital era, software development is a cornerstone of innovation. Inner Source has gained traction in this domain. It is a strategy that applies Open Source practices within an organization. Unlike Open Source, Inner Source is not public. It remains confined to a single organization. This approach encourages collaborative software development. Teams across the organization can contribute, regardless of departmental boundaries. Inner Source fosters a culture of transparency and shared responsibility. It leads to improved code quality and accelerated innovation. By leveraging Inner Source, companies can harness the collective expertise of their employees. They can do so while protecting proprietary code.\u003c/p\u003e\n\u003cp\u003eIf you\u0026rsquo;d like to read more about Inner Source, feel free to do so \u003ca href=\"https://en.wikipedia.org/wiki/Inner_source\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehere on Wikipedia\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"access-modifiers\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#access-modifiers\" class=\"header-mark\"\u003e\u003c/a\u003eAccess Modifiers\u003c/h3\u003e\u003cp\u003eIn C#, access modifiers control access to the class and its members. They are essential for encapsulation. Public, protected, internal, and private are the primary modifiers. Each serves a unique purpose. Public classes are accessible from any other class. Protected classes are accessible within their own class and by derived class instances. Internal classes are accessible only within their own assembly. Private classes are restricted to the containing class.\u003c/p\u003e\n\u003cp\u003eTo understand the exact workings of access modifiers in C#, please reference \u003ca href=\"https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/access-modifiers#summary-table\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ethe Microsoft Learn article here\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"the-analogy-source-strategies-and-access-modifiers\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#the-analogy-source-strategies-and-access-modifiers\" class=\"header-mark\"\u003e\u003c/a\u003eThe Analogy: Source Strategies and Access Modifiers\u003c/h2\u003e\u003cp\u003eAccess modifiers in C# can be compared to source sharing strategies. Internal classes resemble Inner Source, they are accessible within an organization. Consider the following:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOpen Source code is available to \u003cem\u003eeveryone\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eInner Source code is available \u003cem\u003eonly to those in one organization\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eClosed Source code is strictly controlled, \u003cem\u003eonly available to a specific development team\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eIn comparison, Public Classes are \u003cem\u003eopen to everyone\u003c/em\u003e, even from different assemblies (everyone in the world).\u003c/li\u003e\n\u003cli\u003eSimilarly, Internal Classes are closed to everyone, \u003cem\u003eexcept for classes in the same assembly\u003c/em\u003e (a single company).\u003c/li\u003e\n\u003cli\u003eFinally, Private classes are closed to everyone, \u003cem\u003eexcept for methods in the same class\u003c/em\u003e (a development team/department).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThis analogy helps explain how code sharing works in relation to varying levels of accessibility.\u003c/p\u003e\n\u003ch2 id=\"protected-inner-source-1\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#protected-inner-source-1\" class=\"header-mark\"\u003e\u003c/a\u003eProtected Inner Source\u003c/h2\u003e\u003ch3 id=\"a-novel-concept\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#a-novel-concept\" class=\"header-mark\"\u003e\u003c/a\u003eA Novel Concept\u003c/h3\u003e\u003cp\u003eProtected Inner Source, something I have not seen elsewhere so far, is akin to Protected Internal classes. It’s a hybrid access level. It allows sharing among certain trusted organizations. These organizations operate independently yet share a common trust boundary.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDerived classes from different assemblies. Analogous to separate organizations still \u003cem\u003eaffiliated to the same parent organization\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eNon-derived classes from different assemblies, unaffiliated organizations have \u003cem\u003eno access\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg class=\"tw-inline\" loading=\"lazy\" src='/2024/06/20/open-inner-protected-source/protected-inner-source.png' srcset=\"/2024/06/20/open-inner-protected-source/protected-inner-source_hu_7644dbd2a920bbdf.webp 800w, /2024/06/20/open-inner-protected-source/protected-inner-source_hu_e8c8e14d5e4c46dd.webp 1200w, /2024/06/20/open-inner-protected-source/protected-inner-source_hu_ff40bdf358a35985.webp 1600w\" alt=\"protected-inner-source-diagram\" height=\"222\" width=\"601\"\u003e\u003c/p\u003e\n\u003ch3 id=\"specific-applications\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#specific-applications\" class=\"header-mark\"\u003e\u003c/a\u003eSpecific Applications\u003c/h3\u003e\u003cp\u003eWhile this may not apply to most organizations in the world, there are some specific examples:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePublic sector organizations (Federal, EU, etc.) often share (more) freely than private ones.\u003c/li\u003e\n\u003cli\u003ePrivate organizations with complex legal holdings, still sharing trust between sibling companies.\u003c/li\u003e\n\u003cli\u003eConsortiums, in any sector, might need to collaborate on specific source code with similar levels of trust.\u003c/li\u003e\n\u003cli\u003eSource code with low proprietary value, for instance, legacy applications out of support. A contracting company might be given access to take over ownership for specific purposes.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg class=\"tw-inline\" loading=\"lazy\" src='/2024/06/20/open-inner-protected-source/protected-inner-source_gov-us.png' srcset=\"/2024/06/20/open-inner-protected-source/protected-inner-source_gov-us_hu_5e1ec5d4b22dd080.webp 800w, /2024/06/20/open-inner-protected-source/protected-inner-source_gov-us_hu_3e536d58d6f7faa9.webp 1200w, /2024/06/20/open-inner-protected-source/protected-inner-source_gov-us_hu_5faeabffdad412cb.webp 1600w\" alt=\"protected-inner-source-gov-organogram\" height=\"1488\" width=\"2213\"\u003e\n\u003cem\u003ePlease note! This is an example of connected government departments, there was no validation done for this blog post to determine their levels of trust and ability to share code.\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"the-benefits\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#the-benefits\" class=\"header-mark\"\u003e\u003c/a\u003eThe Benefits\u003c/h3\u003e\u003cp\u003eProtected Inner Source offers several benefits:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIt promotes collaboration without compromising security.\u003c/li\u003e\n\u003cli\u003eIt reduces duplication of effort across organizations.\u003c/li\u003e\n\u003cli\u003eIt also accelerates innovation and development.\u003c/li\u003e\n\u003cli\u003eThis approach leverages the strengths of multiple entities.\u003c/li\u003e\n\u003cli\u003eIt does so while maintaining each entity’s autonomy.\u003c/li\u003e\n\u003cli\u003eIt provides traceability in modification of complex solutions.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"considerations-for-implementation\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#considerations-for-implementation\" class=\"header-mark\"\u003e\u003c/a\u003eConsiderations for implementation\u003c/h3\u003e\u003cp\u003eImplementing Protected Inner Source requires careful planning:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTrust and Security\u003c/strong\u003e: How will organizations establish and maintain a trusted relationship? What security measures would be necessary to protect shared code from external threats?\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGovernance\u003c/strong\u003e: Who decides what gets shared and how contributions are managed? There might need to be a governance model that all parties agree upon.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eInteroperability\u003c/strong\u003e: How will the shared code be designed to ensure it is easily adaptable across different organizations’ systems?\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLegal and Compliance\u003c/strong\u003e: Are there legal or regulatory considerations when sharing code between such entities?\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"conclusion\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#conclusion\" class=\"header-mark\"\u003e\u003c/a\u003eConclusion\u003c/h2\u003e\u003cp\u003eProtected Inner Source could revolutionize collaborative development for trusted organizations. It combines the openness of Open Source with the control of Inner Source. This model could be particularly beneficial for government organizations in the public sector. It allows them to share resources efficiently and securely.\u003c/p\u003e\n\u003cp\u003eEspecially in a world where ecosystems are becoming more prominent, this might be beneficial. Imagine not having to spend countless hours working on licensing agreements and NDAs for such partnerships. Build upon trusted relationships in source code sharing strategies. Just like we started doing with federated identities in Identity and Access Management years ago!\u003c/p\u003e\n",
"language": "en"
},
{
"title" : "Firewall Port Status Test Script",
"date_published" : "2017-08-19T11:56:45+02:00",
"date_modified" : "2017-08-19T11:56:45+02:00",
"id" : "https://bearman.nl/2017/08/19/firewall-port-status-test-script/",
"url" : "https://bearman.nl/2017/08/19/firewall-port-status-test-script/",
"summary": "\rFirewall port testing\rIntroRecently I had some issues at a customer project where, due to the complexity of the environment, sometimes firewall ports were closed after they had initially been added to the rules list. This caused unexpected errors for SharePoint, of which we were unaware at the time that these were due to firewall issues.\nWhile analyzing the issue I came across the Test-NetConnection PowerShell command, which I used to manually verify the issue on one server. However when the time came to repeat the command on several servers I started automating things with my own script. Soon enough the project manager asked me if I could output the results of my script to Excel and send him the files by mail.\n",
"content_html" : "\u003ch1 id=\"firewall-port-testing\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#firewall-port-testing\" class=\"header-mark\"\u003e\u003c/a\u003eFirewall port testing\u003c/h1\u003e\u003ch2 id=\"intro\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#intro\" class=\"header-mark\"\u003e\u003c/a\u003eIntro\u003c/h2\u003e\u003cp\u003eRecently I had some issues at a customer project where, due to the complexity of the environment, sometimes firewall ports were closed after they had initially been added to the rules list. This caused unexpected errors for SharePoint, of which we were unaware at the time that these were due to firewall issues.\u003c/p\u003e\n\u003cp\u003eWhile analyzing the issue I came across the Test-NetConnection PowerShell command, which I used to manually verify the issue on one server. However when the time came to repeat the command on several servers I started automating things with my own script. Soon enough the project manager asked me if I could output the results of my script to Excel and send him the files by mail.\u003c/p\u003e\n\u003cp\u003eLogging into several servers to collate the results and manually mail them seemed like a task that could be handled better, so once again I started to redesign and automate the process.\u003c/p\u003e\n\u003ch2 id=\"result\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#result\" class=\"header-mark\"\u003e\u003c/a\u003eResult\u003c/h2\u003e\u003cp\u003eWhat resulted is a script with which you can map out local servers and their outbound server connections by port numbers. You can then run the script (scheduled if you want) on each server locally and it will output to a .htm file. I\u0026rsquo;ve configured it to output it to an IIS hosted file, so the IT operations guys can check the firewall status remotely whenever they want.\u003c/p\u003e\n\u003cp\u003eObviously scheduling a check to ensure firewall ports are still open is not ideal, but should you need it I hope my work will save you some effort!\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/bearmannl/posh/blob/master/Scripts/Test-NetConnections.ps1\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eTest-NetConnections.ps1\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/bearmannl/posh/blob/master/Scripts/Test-NetConnections.json\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eTest-NetConnections.json\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
"language": "en"
},
{
"title" : "Sharepoint ULS Log Files Empty",
"date_published" : "2017-04-18T13:58:57+02:00",
"date_modified" : "2017-04-18T13:58:57+02:00",
"id" : "https://bearman.nl/2017/04/18/sharepoint-uls-log-files-empty/",
"url" : "https://bearman.nl/2017/04/18/sharepoint-uls-log-files-empty/",
"summary": "\rSharePoint ULS\rEmpty log filesRan into an annoying issue today where a SharePoint server was not writing trace log messages, the result was a log directory with 0 bytes logging files.\nIncidentally I found a Event Log error with the code:\n\u0026ldquo;A Session \u0026ldquo;WSSUSAGESESSION15\u0026rdquo; failed to start with the following error: 0xC0000022\u0026rdquo;\nOther posts mention adding the service account (or the WSS_WPG group) for the \u0026lsquo;SharePoint Tracing Service\u0026rsquo; Windows Service to the administrators group, tested that, this indeed fixes the problem. However this does not conform to the principle of least privileged accounts.\n",
"content_html" : "\u003ch1 id=\"sharepoint-uls\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#sharepoint-uls\" class=\"header-mark\"\u003e\u003c/a\u003eSharePoint ULS\u003c/h1\u003e\u003ch2 id=\"empty-log-files\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#empty-log-files\" class=\"header-mark\"\u003e\u003c/a\u003eEmpty log files\u003c/h2\u003e\u003cp\u003eRan into an annoying issue today where a SharePoint server was not writing trace log messages, the result was a log directory with 0 bytes logging files.\u003c/p\u003e\n\u003cp\u003eIncidentally I found a Event Log error with the code:\u003cbr\u003e\n\u0026ldquo;A Session \u0026ldquo;WSSUSAGESESSION15\u0026rdquo; failed to start with the following error: 0xC0000022\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eOther posts mention adding the service account (or the WSS_WPG group) for the \u0026lsquo;SharePoint Tracing Service\u0026rsquo; Windows Service to the administrators group, tested that, this indeed fixes the problem. However this does not conform to the principle of least privileged accounts.\u003c/p\u003e\n\u003ch2 id=\"solution\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#solution\" class=\"header-mark\"\u003e\u003c/a\u003eSolution\u003c/h2\u003e\u003cp\u003eFinally I found that the \u0026lsquo;Performance Log Users\u0026rsquo; security group provides the correct permissions to allow a service to write trace log information.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAdded the service account using commandline \u0026ldquo;net localgroup \u0026ldquo;Performance Log Users\u0026rdquo; \u0026ldquo;domain\\username\u0026rdquo; /add\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eRestarted the \u0026lsquo;SharePoint Tracing Service\u0026rsquo; Windows Service, problem solved with least amount of privileges!\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePS. Adding the WSS_WPG security group to the performance log users group \u003cem\u003edoes not\u003c/em\u003e solve the issue.\u003c/p\u003e\n",
"language": "en"
},
{
"title" : "Creators Update 2 Microsoft Edge Google Inet_e_resource_not_found",
"date_published" : "2017-04-13T12:12:02+02:00",
"date_modified" : "2017-04-13T12:12:02+02:00",
"id" : "https://bearman.nl/2017/04/13/creators-update-2-microsoft-edge-google-inet_e_resource_not_found/",
"url" : "https://bearman.nl/2017/04/13/creators-update-2-microsoft-edge-google-inet_e_resource_not_found/",
"summary": "\rCreators update\rThe issueSince the Creators Update navigating to any Google site (google.com, google.co.uk, google.nl, etc.) results in an INET_E_RESOURCE_NOT_FOUND error, only on my work laptop, none of my other devices which I\u0026rsquo;ve also upgraded.\nThis only happened with Google, no other site had this issue\u0026hellip; furthermore I could reach Google(.com) fine via Ping from commandline, Internet Explorer, FireFox and Chrome\u0026hellip;\nCleared my (Edge) browser cache, history, etc. no results. Everything was working fine until the Creators Update.\n",
"content_html" : "\u003ch1 id=\"creators-update\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#creators-update\" class=\"header-mark\"\u003e\u003c/a\u003eCreators update\u003c/h1\u003e\u003ch2 id=\"the-issue\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#the-issue\" class=\"header-mark\"\u003e\u003c/a\u003eThe issue\u003c/h2\u003e\u003cp\u003eSince the Creators Update navigating to any Google site (google.com, google.co.uk, google.nl, etc.) results in an INET_E_RESOURCE_NOT_FOUND error, only on my work laptop, none of my other devices which I\u0026rsquo;ve also upgraded.\u003c/p\u003e\n\u003cp\u003eThis \u003cem\u003eonly\u003c/em\u003e happened with Google, no other site had this issue\u0026hellip; furthermore I could reach Google(.com) fine via Ping from commandline, Internet Explorer, FireFox and Chrome\u0026hellip;\u003c/p\u003e\n\u003cp\u003eCleared my (Edge) browser cache, history, etc. no results. Everything was working fine until the Creators Update.\u003c/p\u003e\n\u003cp\u003eI reported the issue via the Feedback Hub, \u003cdel\u003ebut obviously that\u0026rsquo;s no guarantee\u003c/del\u003e that I would have my Edge browser working with Google as my default search engine\u0026hellip; and I so much like Edge with Google as the default search engine!\u003c/p\u003e\n\u003ch2 id=\"event-log\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#event-log\" class=\"header-mark\"\u003e\u003c/a\u003eEvent Log\u003c/h2\u003e\u003cp\u003eSo I started to pick through my Event Log one error at a time, fixing minor issues every step of the way. Including the following DCOM error, specifically for the RuntimeBroker service:\u003cbr\u003e\n\u0026ldquo;\u003cem\u003eThe application-specific permission settings do not grant Local Activation permission for the COM Server application with CLSID {D63B10C5-BB46-4990-A94F-E40B9D520160} and APPID {9CA88EE3-ACB7-47C8-AFC4-AB702511C276} to the user NT AUTHORITY\\LOCAL SERVICE SID (S-1-5-19) from address LocalHost (Using LRPC) running in the application container Unavailable SID (Unavailable). This security permission can be modified using the Component Services administrative tool.\u003c/em\u003e\u0026rdquo;\u003cbr\u003e\n\u003cimg class=\"tw-inline\" loading=\"lazy\" src='/images/2017/04/DCOM-300x197.png' alt=\"DCOM\" \u003e\u003c/p\u003e\n\u003cp\u003eAs a SharePoint consultant I come across this type of DCOM error quite regularly:\u003cbr\u003e\n\u003ca href=\"https://support.microsoft.com/en-us/help/920783/event-id-error-messages-10016-and-10017-are-logged-in-the-system-log-after-you-install-windows-sharepoint-services-3.0\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehttps://support.microsoft.com/en-us/help/920783/event-id-error-messages-10016-and-10017-are-logged-in-the-system-log-after-you-install-windows-sharepoint-services-3.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"the-fix\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#the-fix\" class=\"header-mark\"\u003e\u003c/a\u003eThe fix\u003c/h2\u003e\u003cp\u003eIn order to fix the error, first take ownership (right click, permissions, advanced, take ownership) of the following registry keys via RegEdit:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eHKEY_CLASSES_ROOT\\AppID\\{9CA88EE3-ACB7-47c8-AFC4-AB702511C276}\u003c/li\u003e\n\u003cli\u003eHKEY_CLASSES_ROOT\\CLSID\\{D63B10C5-BB46-4990-A94F-E40B9D520160}\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThen ensure you provide the SYSTEM account with local launch \u0026amp; local activation permissions, refer to the Microsoft Support link above if you need specific steps to do so. When prompted that editing these permissions requires you to remove an unrecognized account from the permissions list, click remove. Since the application wasn\u0026rsquo;t functioning properly anyway I figured\u0026hellip; what the hell\u0026hellip; and it\u0026rsquo;s working fine right now.\u003cbr\u003e\n\u003cimg class=\"tw-inline\" loading=\"lazy\" src='/images/2017/04/DCOM_2-300x205.png' alt=\"DCOM 2\" \u003e\u003c/p\u003e\n\u003cp\u003eAfter \u003cdel\u003efixing this\u003c/del\u003e I also noticed the login screen no longer waits 5 seconds before accepting my PIN, \u003cdel\u003etwo for the price of one\u003c/del\u003e!\u003c/p\u003e\n\u003ch2 id=\"update-1\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#update-1\" class=\"header-mark\"\u003e\u003c/a\u003eUpdate #1\u003c/h2\u003e\u003cp\u003e\u003cstrong\u003eUPDATE 19-04-2017:\u003c/strong\u003e\nApparently I was too quick in releasing my post, above did not fix the Google issue. (it \u003cem\u003edid\u003c/em\u003e however fix the slowdown in accepting my PIN)\u003c/p\u003e\n\u003cp\u003eAs provided by Microsoft the issue can be worked around in two ways until they release a fix:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eType about:flags in the address bar. Scroll down to the Networking section (near the bottom) and uncheck Enable TCP Fast Open, \u003cem\u003ethen restart the browser\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eUse InPrivate Browsing when using Edge.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWhat the feature does:\u003cbr\u003e\n\u003ca href=\"https://www.windowscentral.com/enable-tcp-fast-open-microsoft-edge-faster-page-load-times\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehttps://www.windowscentral.com/enable-tcp-fast-open-microsoft-edge-faster-page-load-times\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI did disable this feature, I just didn\u0026rsquo;t restart my browser afterwards\u0026hellip; this led me to believe the above fix actually resolved my issue. \u003cstrong\u003eKudo\u0026rsquo;s to Microsoft\u003c/strong\u003e for providing a workaround via the Feedback Hub!\u003c/p\u003e\n",
"language": "en"
},
{
"title" : "Creators Update 1 Remoteapp and Desktop Connection Gateway Unavailable",
"date_published" : "2017-04-10T13:11:47+02:00",
"date_modified" : "2017-04-10T13:11:47+02:00",
"id" : "https://bearman.nl/2017/04/10/creators-update-1-remoteapp-and-desktop-connection-gateway-unavailable/",
"url" : "https://bearman.nl/2017/04/10/creators-update-1-remoteapp-and-desktop-connection-gateway-unavailable/",
"summary": "\rCreators Update\rThe IssueLast week I upgraded all my personal Windows 10 devices to build 1703 (Creators Update) and after a few days of testing I was convinced this build is solid enough to upgrade my work laptop as well\u0026hellip; true so far except for one minor issue! When I had to connect to a client\u0026rsquo;s RemoteApp and Desktop Connection gateway, which they host on Windows Server 2008R2, I got the following error: \u0026ldquo;Your computer can’t connect to the Remote Desktop Gateway server. Contact your network administrator for assistance.\u0026rdquo; I don\u0026rsquo;t know exactly what changed in this Windows build with regards to the RDP client, however I worked around it by restoring the following two files to the Windows System32 folder, from the Windows.old folder:\n",
"content_html" : "\u003ch1 id=\"creators-update\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#creators-update\" class=\"header-mark\"\u003e\u003c/a\u003eCreators Update\u003c/h1\u003e\u003ch2 id=\"the-issue\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#the-issue\" class=\"header-mark\"\u003e\u003c/a\u003eThe Issue\u003c/h2\u003e\u003cp\u003eLast week I upgraded all my personal Windows 10 devices to build 1703 (Creators Update) and after a few days of testing I was convinced this build is solid enough to upgrade my work laptop as well\u0026hellip; true so far except for one minor issue! When I had to connect to a client\u0026rsquo;s RemoteApp and Desktop Connection gateway, which they host on Windows Server 2008R2, I got the following error: \u0026ldquo;\u003cem\u003eYour computer can’t connect to the Remote Desktop Gateway server. Contact your network administrator for assistance.\u003c/em\u003e\u0026rdquo; I don\u0026rsquo;t know exactly what changed in this Windows build with regards to the RDP client, however I worked around it by restoring the following two files to the Windows System32 folder, from the Windows.old folder:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emstsc.exe\u003c/li\u003e\n\u003cli\u003emstsccax.dll\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg class=\"tw-inline\" loading=\"lazy\" src='/images/2017/04/MSTSC_replace-300x300.png' alt=\"MTSC replace\" \u003e\u003c/p\u003e\n\u003ch2 id=\"to-be-continued\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#to-be-continued\" class=\"header-mark\"\u003e\u003c/a\u003eTo be continued\u0026hellip;\u003c/h2\u003e\u003cp\u003eAs you can see from the file replace details, the files have changed somewhat with this new build. I don\u0026rsquo;t yet know if this also occurs with RDS hosted on 2012 and up, if it does please leave a comment below. Obviously not a permanent solution, but unfortunately I don\u0026rsquo;t have the luxury of waiting for one.\u003c/p\u003e\n",
"language": "en"
},
{
"title" : "Password Change Notification Script",
"date_published" : "2016-06-23T14:09:50+02:00",
"date_modified" : "2016-06-23T14:09:50+02:00",
"id" : "https://bearman.nl/2016/06/23/password-change-notification-script/",
"url" : "https://bearman.nl/2016/06/23/password-change-notification-script/",
"summary": "\rPassword change notification\rVersion 1.4Recently I found myself in need of a password change notification script. What do all efficient/lazy administrators do when they need a script for any purpose? Right, I searched one online, downloaded it, checked it, suppressed any desire to fiddle with it and then scheduled it to run. For those interested, I used the script provided by Robert Pearman over at the Technet Gallery. For Office365 compatibility check his post here…\n",
"content_html" : "\u003ch1 id=\"password-change-notification\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#password-change-notification\" class=\"header-mark\"\u003e\u003c/a\u003ePassword change notification\u003c/h1\u003e\u003ch2 id=\"version-14\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#version-14\" class=\"header-mark\"\u003e\u003c/a\u003eVersion 1.4\u003c/h2\u003e\u003cp\u003eRecently I found myself in need of a password change notification script. What do all efficient/lazy administrators do when they need a script for any purpose? Right, I searched one online, downloaded it, \u003cem\u003echecked it\u003c/em\u003e, suppressed any desire to fiddle with it and then scheduled it to run. For those interested, I used the script provided by Robert Pearman \u003ca href=\"https://gallery.technet.microsoft.com/Password-Expiry-Email-177c3e27\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eover at the Technet Gallery\u003c/a\u003e. For Office365 compatibility check \u003ca href=\"https://windowsserveressentials.com/2015/01/23/office-365-email-password-reminder/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ehis post here\u003c/a\u003e…\u003c/p\u003e\n\u003ch2 id=\"version-20\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#version-20\" class=\"header-mark\"\u003e\u003c/a\u003eVersion 2.0\u003c/h2\u003e\u003cp\u003eBut then… that annoying little OCD gene (those of you who have it surely recognize it!) crept up on me today and I started fiddling with it anyway. I told myself the script needed to include some customizations for my company, but who am I kidding, I would lose sleep if I didn’t give in to my OCD quirks every once in a while. In general, I changed the script to include a proper description block, parameters, cleanup of casing for variables and refactoring of some Boolean uses to shorten the if statements. The part I needed to change specifically for Silverside was the Filter for the Get-ADUser command, this allows me to filter out Admin accounts in our organization:\u003c/p\u003e\n\u003cdiv class=\"code-block highlight is-open show-line-numbers tw-group tw-my-2\"\u003e\r\n \u003cdiv class=\"\r\n \r\n tw-flex \r\n tw-flex-row\r\n tw-flex-1 \r\n tw-justify-between \r\n tw-w-full tw-bg-bgColor-secondary\r\n \"\u003e \r\n \u003cbutton \r\n class=\"\r\n code-block-button\r\n tw-mx-2 \r\n tw-flex\r\n tw-flex-row\r\n tw-flex-1\"\r\n aria-hidden=\"true\"\u003e\r\n \u003cdiv class=\"group-[.is-open]:tw-rotate-90 tw-transition-[transform] tw-duration-500 tw-ease-in-out print:!tw-hidden tw-w-min tw-h-min tw-my-1 tw-mx-1\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z\"/\u003e\u003c/svg\u003e\u003c/div\u003e\r\n \u003cp class=\"tw-select-none !tw-my-1\"\u003epowershell\u003c/p\u003e\r\n \u003c/button\u003e\r\n\r\n \u003cdiv class=\"tw-flex\"\u003e\r\n \u003cbutton \r\n class=\"\r\n line-number-button\r\n tw-mx-2 \r\n tw-hidden \r\n group-[.is-open]:tw-block \r\n group-[.show-line-numbers]:tw-text-fgColor-link \r\n print:!tw-hidden\" \r\n title=\"Toggle line numbers\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M61.77 401l17.5-20.15a19.92 19.92 0 0 0 5.07-14.19v-3.31C84.34 356 80.5 352 73 352H16a8 8 0 0 0-8 8v16a8 8 0 0 0 8 8h22.83a157.41 157.41 0 0 0-11 12.31l-5.61 7c-4 5.07-5.25 10.13-2.8 14.88l1.05 1.93c3 5.76 6.29 7.88 12.25 7.88h4.73c10.33 0 15.94 2.44 15.94 9.09 0 4.72-4.2 8.22-14.36 8.22a41.54 41.54 0 0 1-15.47-3.12c-6.49-3.88-11.74-3.5-15.6 3.12l-5.59 9.31c-3.72 6.13-3.19 11.72 2.63 15.94 7.71 4.69 20.38 9.44 37 9.44 34.16 0 48.5-22.75 48.5-44.12-.03-14.38-9.12-29.76-28.73-34.88zM496 224H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM16 160h64a8 8 0 0 0 8-8v-16a8 8 0 0 0-8-8H64V40a8 8 0 0 0-8-8H32a8 8 0 0 0-7.14 4.42l-8 16A8 8 0 0 0 24 64h8v64H16a8 8 0 0 0-8 8v16a8 8 0 0 0 8 8zm-3.91 160H80a8 8 0 0 0 8-8v-16a8 8 0 0 0-8-8H41.32c3.29-10.29 48.34-18.68 48.34-56.44 0-29.06-25-39.56-44.47-39.56-21.36 0-33.8 10-40.46 18.75-4.37 5.59-3 10.84 2.8 15.37l8.58 6.88c5.61 4.56 11 2.47 16.12-2.44a13.44 13.44 0 0 1 9.46-3.84c3.33 0 9.28 1.56 9.28 8.75C51 248.19 0 257.31 0 304.59v4C0 316 5.08 320 12.09 320z\"/\u003e\u003c/svg\u003e\u003c/button\u003e\r\n\r\n \u003cbutton \r\n class=\"\r\n wrap-code-button\r\n tw-select-none \r\n tw-mx-2 \r\n tw-hidden \r\n group-[.is-open]:tw-block \r\n group-[.is-wrap]:tw-text-fgColor-link \r\n print:!tw-hidden\" \r\n title=\"Toggle code wrap\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z\"/\u003e\u003c/svg\u003e\u003c/button\u003e\r\n \r\n \u003cbutton \r\n class=\"\r\n copy-code-button\r\n tw-select-none\r\n tw-mx-2 \r\n tw-hidden\r\n group-[.is-open]:tw-block\r\n hover:tw-text-fgColor-link \r\n print:!tw-hidden\"\r\n title=\"Copy code\"\u003e\r\n \u003cspan class=\"copy-icon tw-block\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z\"/\u003e\u003c/svg\u003e\u003c/span\u003e\r\n \u003cspan class=\"check-icon tw-hidden\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"/\u003e\u003c/svg\u003e\u003c/span\u003e\r\n \u003c/button\u003e\r\n \r\n \u003cbutton \r\n class=\"\r\n tw-select-none \r\n tw-mx-2 \r\n tw-block \r\n group-[.is-open]:tw-hidden \r\n print:!tw-hidden\" \r\n disabled\r\n aria-hidden=\"true\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M328 256c0 39.8-32.2 72-72 72s-72-32.2-72-72 32.2-72 72-72 72 32.2 72 72zm104-72c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72zm-352 0c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72z\"/\u003e\u003c/svg\u003e\u003c/button\u003e\r\n \u003c/div\u003e\r\n \u003c/div\u003e\r\n \u003cpre style=\"counter-reset: codeblock;\" class=\"tw-block tw-m-0 tw-p-0\"\u003e\u003ccode \r\n id=\"codeblock-id-1\" \r\n class=\"\r\n chroma \r\n !tw-block \r\n tw-p-0\r\n tw-m-0\r\n tw-transition-[max-height] \r\n tw-duration-500 \r\n tw-ease-in-out \r\n group-[.is-closed]:!tw-max-h-0 \r\n group-[.is-wrap]:tw-text-wrap\r\n tw-overflow-y-hidden\r\n tw-overflow-x-auto\r\n tw-scrollbar-thin\r\n \"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e…\u003c/span\u003e \u003cspan class=\"o\"\u003e-and\u003c/span\u003e \u003cspan class=\"nv\"\u003e$_\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eUserPrincipalName\u003c/span\u003e \u003cspan class=\"o\"\u003e-notlike\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;adm*\u0026#39;\u003c/span\u003e \u003cspan class=\"err\"\u003e…\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\r\n\u003c/div\u003e\r\n\u003cp\u003eOverall the script is now easier to deploy out of the box with the use of parameters (including defaults), so long as you remember to adjust \u003cem\u003e\u003cstrong\u003eat least\u003c/strong\u003e\u003c/em\u003e the \u003cstrong\u003e$smtpServer\u003c/strong\u003e and \u003cstrong\u003e$from\u003c/strong\u003e variables under the config section:\u003c/p\u003e\n\u003cdiv class=\"code-block highlight is-open show-line-numbers tw-group tw-my-2\"\u003e\r\n \u003cdiv class=\"\r\n \r\n tw-flex \r\n tw-flex-row\r\n tw-flex-1 \r\n tw-justify-between \r\n tw-w-full tw-bg-bgColor-secondary\r\n \"\u003e \r\n \u003cbutton \r\n class=\"\r\n code-block-button\r\n tw-mx-2 \r\n tw-flex\r\n tw-flex-row\r\n tw-flex-1\"\r\n aria-hidden=\"true\"\u003e\r\n \u003cdiv class=\"group-[.is-open]:tw-rotate-90 tw-transition-[transform] tw-duration-500 tw-ease-in-out print:!tw-hidden tw-w-min tw-h-min tw-my-1 tw-mx-1\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z\"/\u003e\u003c/svg\u003e\u003c/div\u003e\r\n \u003cp class=\"tw-select-none !tw-my-1\"\u003epowershell\u003c/p\u003e\r\n \u003c/button\u003e\r\n\r\n \u003cdiv class=\"tw-flex\"\u003e\r\n \u003cbutton \r\n class=\"\r\n line-number-button\r\n tw-mx-2 \r\n tw-hidden \r\n group-[.is-open]:tw-block \r\n group-[.show-line-numbers]:tw-text-fgColor-link \r\n print:!tw-hidden\" \r\n title=\"Toggle line numbers\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M61.77 401l17.5-20.15a19.92 19.92 0 0 0 5.07-14.19v-3.31C84.34 356 80.5 352 73 352H16a8 8 0 0 0-8 8v16a8 8 0 0 0 8 8h22.83a157.41 157.41 0 0 0-11 12.31l-5.61 7c-4 5.07-5.25 10.13-2.8 14.88l1.05 1.93c3 5.76 6.29 7.88 12.25 7.88h4.73c10.33 0 15.94 2.44 15.94 9.09 0 4.72-4.2 8.22-14.36 8.22a41.54 41.54 0 0 1-15.47-3.12c-6.49-3.88-11.74-3.5-15.6 3.12l-5.59 9.31c-3.72 6.13-3.19 11.72 2.63 15.94 7.71 4.69 20.38 9.44 37 9.44 34.16 0 48.5-22.75 48.5-44.12-.03-14.38-9.12-29.76-28.73-34.88zM496 224H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM16 160h64a8 8 0 0 0 8-8v-16a8 8 0 0 0-8-8H64V40a8 8 0 0 0-8-8H32a8 8 0 0 0-7.14 4.42l-8 16A8 8 0 0 0 24 64h8v64H16a8 8 0 0 0-8 8v16a8 8 0 0 0 8 8zm-3.91 160H80a8 8 0 0 0 8-8v-16a8 8 0 0 0-8-8H41.32c3.29-10.29 48.34-18.68 48.34-56.44 0-29.06-25-39.56-44.47-39.56-21.36 0-33.8 10-40.46 18.75-4.37 5.59-3 10.84 2.8 15.37l8.58 6.88c5.61 4.56 11 2.47 16.12-2.44a13.44 13.44 0 0 1 9.46-3.84c3.33 0 9.28 1.56 9.28 8.75C51 248.19 0 257.31 0 304.59v4C0 316 5.08 320 12.09 320z\"/\u003e\u003c/svg\u003e\u003c/button\u003e\r\n\r\n \u003cbutton \r\n class=\"\r\n wrap-code-button\r\n tw-select-none \r\n tw-mx-2 \r\n tw-hidden \r\n group-[.is-open]:tw-block \r\n group-[.is-wrap]:tw-text-fgColor-link \r\n print:!tw-hidden\" \r\n title=\"Toggle code wrap\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z\"/\u003e\u003c/svg\u003e\u003c/button\u003e\r\n \r\n \u003cbutton \r\n class=\"\r\n copy-code-button\r\n tw-select-none\r\n tw-mx-2 \r\n tw-hidden\r\n group-[.is-open]:tw-block\r\n hover:tw-text-fgColor-link \r\n print:!tw-hidden\"\r\n title=\"Copy code\"\u003e\r\n \u003cspan class=\"copy-icon tw-block\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z\"/\u003e\u003c/svg\u003e\u003c/span\u003e\r\n \u003cspan class=\"check-icon tw-hidden\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"/\u003e\u003c/svg\u003e\u003c/span\u003e\r\n \u003c/button\u003e\r\n \r\n \u003cbutton \r\n class=\"\r\n tw-select-none \r\n tw-mx-2 \r\n tw-block \r\n group-[.is-open]:tw-hidden \r\n print:!tw-hidden\" \r\n disabled\r\n aria-hidden=\"true\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M328 256c0 39.8-32.2 72-72 72s-72-32.2-72-72 32.2-72 72-72 72 32.2 72 72zm104-72c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72zm-352 0c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72z\"/\u003e\u003c/svg\u003e\u003c/button\u003e\r\n \u003c/div\u003e\r\n \u003c/div\u003e\r\n \u003cpre style=\"counter-reset: codeblock;\" class=\"tw-block tw-m-0 tw-p-0\"\u003e\u003ccode \r\n id=\"codeblock-id-2\" \r\n class=\"\r\n chroma \r\n !tw-block \r\n tw-p-0\r\n tw-m-0\r\n tw-transition-[max-height] \r\n tw-duration-500 \r\n tw-ease-in-out \r\n group-[.is-closed]:!tw-max-h-0 \r\n group-[.is-wrap]:tw-text-wrap\r\n tw-overflow-y-hidden\r\n tw-overflow-x-auto\r\n tw-scrollbar-thin\r\n \"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$smtpServer\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;mail.yourdomain.local\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$from\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Your Company IT noreply@yourdomain.com\u0026#34;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\r\n\u003c/div\u003e\r\n\u003ch2 id=\"the-final-script\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#the-final-script\" class=\"header-mark\"\u003e\u003c/a\u003eThe final script\u003c/h2\u003e\u003cp\u003eAs you no doubt found this post after efficiently searching for a free scipt online, feel free to use, I hope it saves you some time. Just remember to include the original author as described in the comments. You can also find the latest version at my GitHub account, \u003ca href=\"https://github.com/bearmannl/posh/blob/master/Scripts/Send-PasswordChangeNotification.ps1\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eSend-PasswordChangeNotification.ps1\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"code-block highlight is-closed show-line-numbers tw-group tw-my-2\"\u003e\r\n \u003cdiv class=\"\r\n \r\n tw-flex \r\n tw-flex-row\r\n tw-flex-1 \r\n tw-justify-between \r\n tw-w-full tw-bg-bgColor-secondary\r\n \"\u003e \r\n \u003cbutton \r\n class=\"\r\n code-block-button\r\n tw-mx-2 \r\n tw-flex\r\n tw-flex-row\r\n tw-flex-1\"\r\n aria-hidden=\"true\"\u003e\r\n \u003cdiv class=\"group-[.is-open]:tw-rotate-90 tw-transition-[transform] tw-duration-500 tw-ease-in-out print:!tw-hidden tw-w-min tw-h-min tw-my-1 tw-mx-1\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z\"/\u003e\u003c/svg\u003e\u003c/div\u003e\r\n \u003cp class=\"tw-select-none !tw-my-1\"\u003epowershell\u003c/p\u003e\r\n \u003c/button\u003e\r\n\r\n \u003cdiv class=\"tw-flex\"\u003e\r\n \u003cbutton \r\n class=\"\r\n line-number-button\r\n tw-mx-2 \r\n tw-hidden \r\n group-[.is-open]:tw-block \r\n group-[.show-line-numbers]:tw-text-fgColor-link \r\n print:!tw-hidden\" \r\n title=\"Toggle line numbers\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M61.77 401l17.5-20.15a19.92 19.92 0 0 0 5.07-14.19v-3.31C84.34 356 80.5 352 73 352H16a8 8 0 0 0-8 8v16a8 8 0 0 0 8 8h22.83a157.41 157.41 0 0 0-11 12.31l-5.61 7c-4 5.07-5.25 10.13-2.8 14.88l1.05 1.93c3 5.76 6.29 7.88 12.25 7.88h4.73c10.33 0 15.94 2.44 15.94 9.09 0 4.72-4.2 8.22-14.36 8.22a41.54 41.54 0 0 1-15.47-3.12c-6.49-3.88-11.74-3.5-15.6 3.12l-5.59 9.31c-3.72 6.13-3.19 11.72 2.63 15.94 7.71 4.69 20.38 9.44 37 9.44 34.16 0 48.5-22.75 48.5-44.12-.03-14.38-9.12-29.76-28.73-34.88zM496 224H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM16 160h64a8 8 0 0 0 8-8v-16a8 8 0 0 0-8-8H64V40a8 8 0 0 0-8-8H32a8 8 0 0 0-7.14 4.42l-8 16A8 8 0 0 0 24 64h8v64H16a8 8 0 0 0-8 8v16a8 8 0 0 0 8 8zm-3.91 160H80a8 8 0 0 0 8-8v-16a8 8 0 0 0-8-8H41.32c3.29-10.29 48.34-18.68 48.34-56.44 0-29.06-25-39.56-44.47-39.56-21.36 0-33.8 10-40.46 18.75-4.37 5.59-3 10.84 2.8 15.37l8.58 6.88c5.61 4.56 11 2.47 16.12-2.44a13.44 13.44 0 0 1 9.46-3.84c3.33 0 9.28 1.56 9.28 8.75C51 248.19 0 257.31 0 304.59v4C0 316 5.08 320 12.09 320z\"/\u003e\u003c/svg\u003e\u003c/button\u003e\r\n\r\n \u003cbutton \r\n class=\"\r\n wrap-code-button\r\n tw-select-none \r\n tw-mx-2 \r\n tw-hidden \r\n group-[.is-open]:tw-block \r\n group-[.is-wrap]:tw-text-fgColor-link \r\n print:!tw-hidden\" \r\n title=\"Toggle code wrap\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z\"/\u003e\u003c/svg\u003e\u003c/button\u003e\r\n \r\n \u003cbutton \r\n class=\"\r\n copy-code-button\r\n tw-select-none\r\n tw-mx-2 \r\n tw-hidden\r\n group-[.is-open]:tw-block\r\n hover:tw-text-fgColor-link \r\n print:!tw-hidden\"\r\n title=\"Copy code\"\u003e\r\n \u003cspan class=\"copy-icon tw-block\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z\"/\u003e\u003c/svg\u003e\u003c/span\u003e\r\n \u003cspan class=\"check-icon tw-hidden\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"/\u003e\u003c/svg\u003e\u003c/span\u003e\r\n \u003c/button\u003e\r\n \r\n \u003cbutton \r\n class=\"\r\n tw-select-none \r\n tw-mx-2 \r\n tw-block \r\n group-[.is-open]:tw-hidden \r\n print:!tw-hidden\" \r\n disabled\r\n aria-hidden=\"true\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M328 256c0 39.8-32.2 72-72 72s-72-32.2-72-72 32.2-72 72-72 72 32.2 72 72zm104-72c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72zm-352 0c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72z\"/\u003e\u003c/svg\u003e\u003c/button\u003e\r\n \u003c/div\u003e\r\n \u003c/div\u003e\r\n \u003cpre style=\"counter-reset: codeblock;\" class=\"tw-block tw-m-0 tw-p-0\"\u003e\u003ccode \r\n id=\"codeblock-id-3\" \r\n class=\"\r\n chroma \r\n !tw-block \r\n tw-p-0\r\n tw-m-0\r\n tw-transition-[max-height] \r\n tw-duration-500 \r\n tw-ease-in-out \r\n group-[.is-closed]:!tw-max-h-0 \r\n group-[.is-wrap]:tw-text-wrap\r\n tw-overflow-y-hidden\r\n tw-overflow-x-auto\r\n tw-scrollbar-thin\r\n \"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\u0026lt;#\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e.\u003c/span\u003e\u003cspan class=\"sd\"\u003eSYNOPSIS\u003c/span\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e Get all users with a soon to expire password and send them a reminder to do so.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e.\u003c/span\u003e\u003cspan class=\"sd\"\u003eDESCRIPTION\u003c/span\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e This script gets all users with a soon to expire password and sends them a reminder to do so. This script was originally created by Robert Pearman and posted on the technet gallery. Since modified by Mike Beerman to include changes specific for Silverside. Settings such as the destination SMTP server and From address can only be configured within the script.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e.PARAMETER ExpireInDays\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e Optional input allowing an override to the number of days at which the script will send a reminder. Defaults to 30 days.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e.PARAMETER Logging\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e Switch which determines if a seperate CSV logfile should be created. Default to false without the switch.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e.PARAMETER LogPath\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e Folderpath for the logfile, plain string format.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e.PARAMETER Testing\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e Switch which determines if the emails should be sent to the test recipient instead of the actual users. Default to false without the switch.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e.PARAMETER TestRecipient\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e Optional string for setting a different recipient in testing for testing purposes. Will not be used if Testing is not included in the command or email is disabled.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e.PARAMETER TestMailDisabled\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e Switch for disabling email functionality.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e.\u003c/span\u003e\u003cspan class=\"sd\"\u003eEXAMPLE\u003c/span\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003eSend-PasswordChangeNotification.ps1\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003eSend-PasswordChangeNotification.ps1 -Expire 60 -Logging -Logile \u0026#34;C:\\Logs\\PasswordChangeNotifications.csv\u0026#34; -Testing -TestRecipient \u0026#34;yourname@yourdomain.com\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e.\u003c/span\u003e\u003cspan class=\"sd\"\u003eLINK\u003c/span\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e https://gallery.technet.microsoft.com/Password-Expiry-Email-177c3e27\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e https://bearman.nl/2016/06/23/password-change-notification-script\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e.\u003c/span\u003e\u003cspan class=\"sd\"\u003eNOTES\u003c/span\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e Authors : Mike Beerman\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e Company : Silverside\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e Date : 2016-06-23\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e Version : 2.0\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e Authors : Robert Pearman (WSSMB MVP)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e Company : Windows Server Essentials\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e Date : 2016-02-03\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e Version : 1.4\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e#\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eparam\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003eValidateRange\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"mf\"\u003e365\u003c/span\u003e\u003cspan class=\"p\"\u003e)][\u003c/span\u003e\u003cspan class=\"no\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"nv\"\u003e$ExpireInDays\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e30\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"no\"\u003eswitch\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"nv\"\u003e$Logging\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"no\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"nv\"\u003e$LogPath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;C:\\Logs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"no\"\u003eswitch\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"nv\"\u003e$Testing\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"no\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"nv\"\u003e$TestRecipient\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;yourname@yourdomain.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"no\"\u003eswitch\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"nv\"\u003e$TestMailDisabled\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Config values\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$smtpServer\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;mail.yourdomain.local\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$from\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Your Company IT \u0026lt;noreply@yourdomain.com\u0026gt;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$textEncoding\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"no\"\u003eSystem.Text.Encoding\u003c/span\u003e\u003cspan class=\"p\"\u003e]::\u003c/span\u003e\u003cspan class=\"n\"\u003eUTF8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$logDate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eGet-Date\u003c/span\u003e \u003cspan class=\"n\"\u003e-Format\u003c/span\u003e \u003cspan class=\"n\"\u003eyyyyMMdd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$LogPath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$LogPath\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"py\"\u003eTrimEnd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\\\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$logFile\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$LogPath\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\\PasswordChangeNotifications.csv\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e#Initiate PowerShell session\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Set threading\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$ver\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$host\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eSelect-Object\u003c/span\u003e \u003cspan class=\"n\"\u003eVersion\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$ver\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eMajor\u003c/span\u003e \u003cspan class=\"o\"\u003e-gt\u003c/span\u003e \u003cspan class=\"mf\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nv\"\u003e$Host\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eRunspace\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eThreadOptions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ReuseThread\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Load Active Directory PowerShell snap-in\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eImport-Module\u003c/span\u003e \u003cspan class=\"n\"\u003eActiveDirectory\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eWrite-Verbose\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;[{0}] - AD PowerShell SnapIn loaded\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-f\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eGet-Date\u003c/span\u003e \u003cspan class=\"n\"\u003e-Format\u003c/span\u003e \u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$verbosePreference\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Continue\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Check Logging Settings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$Logging\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# Test Log Folder Path and create new directory if false\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"vm\"\u003e$null\u003c/span\u003e \u003cspan class=\"o\"\u003e-eq\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eTest-Path\u003c/span\u003e \u003cspan class=\"nv\"\u003e$LogPath\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# Create CSV File and Headers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003eNew-Item\u003c/span\u003e \u003cspan class=\"nv\"\u003e$LogPath\u003c/span\u003e \u003cspan class=\"n\"\u003e-ItemType\u003c/span\u003e \u003cspan class=\"n\"\u003eDirectory\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eOut-Null\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003eWrite-Verbose\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;[{0}] - New folder created at [{1}]\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-f\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eGet-Date\u003c/span\u003e \u003cspan class=\"n\"\u003e-Format\u003c/span\u003e \u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"nv\"\u003e$LogPath\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# Test Log File Path and create new file if false\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"vm\"\u003e$null\u003c/span\u003e \u003cspan class=\"o\"\u003e-eq\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eTest-Path\u003c/span\u003e \u003cspan class=\"nv\"\u003e$logFile\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# Create CSV File and Headers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003eNew-Item\u003c/span\u003e \u003cspan class=\"nv\"\u003e$logFile\u003c/span\u003e \u003cspan class=\"n\"\u003e-ItemType\u003c/span\u003e \u003cspan class=\"n\"\u003eFile\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eOut-Null\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003eAdd-Content\u003c/span\u003e \u003cspan class=\"nv\"\u003e$logFile\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Date,Name,EmailAddress,DaystoExpire,ExpiresOn,Notified\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003eWrite-Verbose\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;[{0}] - New logfile created at [{1}]\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-f\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eGet-Date\u003c/span\u003e \u003cspan class=\"n\"\u003e-Format\u003c/span\u003e \u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"nv\"\u003e$logFile\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e# End Logging Check\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$DefaultmaxPasswordAge\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eGet-ADDefaultDomainPasswordPolicy\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"py\"\u003eMaxPasswordAge\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Get Users From AD who are Enabled, Passwords Expire and are Not Currently Expired\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$users\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eGet-ADUser\u003c/span\u003e \u003cspan class=\"n\"\u003e-Filter\u003c/span\u003e \u003cspan class=\"p\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003e-Properties\u003c/span\u003e \u003cspan class=\"n\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ePasswordNeverExpires\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ePasswordExpired\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ePasswordLastSet\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eEmailAddress\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eWhere-Object\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"nv\"\u003e$_\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eEnabled\u003c/span\u003e \u003cspan class=\"o\"\u003e-eq\u003c/span\u003e \u003cspan class=\"vm\"\u003e$true\u003c/span\u003e \u003cspan class=\"o\"\u003e-and\u003c/span\u003e \u003cspan class=\"nv\"\u003e$_\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003ePasswordNeverExpires\u003c/span\u003e \u003cspan class=\"o\"\u003e-eq\u003c/span\u003e \u003cspan class=\"vm\"\u003e$false\u003c/span\u003e \u003cspan class=\"o\"\u003e-and\u003c/span\u003e \u003cspan class=\"nv\"\u003e$_\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003epasswordexpired\u003c/span\u003e \u003cspan class=\"o\"\u003e-eq\u003c/span\u003e \u003cspan class=\"vm\"\u003e$false\u003c/span\u003e \u003cspan class=\"o\"\u003e-and\u003c/span\u003e \u003cspan class=\"nv\"\u003e$_\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eUserPrincipalName\u003c/span\u003e \u003cspan class=\"o\"\u003e-notlike\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;adm*\u0026#39;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Process Each User for Password Expiry\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eforeach\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$user\u003c/span\u003e \u003cspan class=\"k\"\u003ein\u003c/span\u003e \u003cspan class=\"nv\"\u003e$users\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$name\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$user\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$emailAddress\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$user\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eEmailAddress\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$passwordSetDate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$user\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003ePasswordLastSet\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$PasswordPol\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eGet-ADUserResultantPasswordPolicy\u003c/span\u003e \u003cspan class=\"nv\"\u003e$user\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$sent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e \u003cspan class=\"c\"\u003e# Reset Sent Flag\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# Check for Fine Grained Password\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"vm\"\u003e$null\u003c/span\u003e \u003cspan class=\"o\"\u003e-ne\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$PasswordPol\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$maxPasswordAge\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$PasswordPol\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"py\"\u003eMaxPasswordAge\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# No FGP set to Domain Default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$maxPasswordAge\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$DefaultmaxPasswordAge\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$expiresOn\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$passwordSetDate\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"nv\"\u003e$maxPasswordAge\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$today\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eGet-Date\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$daysToExpire\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eNew-TimeSpan\u003c/span\u003e \u003cspan class=\"n\"\u003e-Start\u003c/span\u003e \u003cspan class=\"nv\"\u003e$today\u003c/span\u003e \u003cspan class=\"n\"\u003e-End\u003c/span\u003e \u003cspan class=\"nv\"\u003e$expiresOn\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"py\"\u003eDays\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# Set Greeting based on Number of Days to Expiry.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# Check Number of Days to Expiry\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$messageDays\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$daysToExpire\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"nv\"\u003e$messageDays\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-gt\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$messageDays\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;in \u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$daysToExpire\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34; days.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$messageDays\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;today.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# Email Subject Set Here\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$subject\u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Your password will expire \u003c/span\u003e\u003cspan class=\"nv\"\u003e$messageDays\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# Email Body Set Here, Note You can use HTML, including Images.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$body\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e Dear \u003c/span\u003e\u003cspan class=\"nv\"\u003e$name\u003c/span\u003e\u003cspan class=\"s2\"\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e \u0026lt;p\u0026gt; Your Password will expire \u003c/span\u003e\u003cspan class=\"nv\"\u003e$messageDays\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026lt;br\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e To change your password on a PC press CTRL ALT Delete and choose Change Password \u0026lt;br\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e \u0026lt;p\u0026gt;Thanks, \u0026lt;br\u0026gt; \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e Your Comany IT Administrators\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e \u0026lt;/p\u0026gt;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# If Testing Is Enabled - Email Administrator\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$Testing\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$emailAddress\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$TestRecipient\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e# End Testing\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# If a user has no email address listed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"vm\"\u003e$null\u003c/span\u003e \u003cspan class=\"o\"\u003e-eq\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$emailAddress\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$emailAddress\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"nv\"\u003e$TestRecipient\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"c\"\u003e# End No Valid Email\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# Send Email Message\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"nv\"\u003e$daysToExpire\u003c/span\u003e \u003cspan class=\"o\"\u003e-eq\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;0\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-or\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$daysToExpire\u003c/span\u003e \u003cspan class=\"o\"\u003e-eq\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;14\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-or\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$daysToExpire\u003c/span\u003e \u003cspan class=\"o\"\u003e-eq\u003c/span\u003e \u003cspan class=\"nv\"\u003e$ExpireInDays\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$sent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Yes\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# If Logging is Enabled Log Details\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$Logging\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003eAdd-Content\u003c/span\u003e \u003cspan class=\"nv\"\u003e$logFile\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$logDate\u003c/span\u003e\u003cspan class=\"s2\"\u003e,\u003c/span\u003e\u003cspan class=\"nv\"\u003e$name\u003c/span\u003e\u003cspan class=\"s2\"\u003e,\u003c/span\u003e\u003cspan class=\"nv\"\u003e$emailAddress\u003c/span\u003e\u003cspan class=\"s2\"\u003e,\u003c/span\u003e\u003cspan class=\"nv\"\u003e$daysToExpire\u003c/span\u003e\u003cspan class=\"s2\"\u003e,\u003c/span\u003e\u003cspan class=\"nv\"\u003e$expiresOn\u003c/span\u003e\u003cspan class=\"s2\"\u003e,\u003c/span\u003e\u003cspan class=\"nv\"\u003e$sent\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003eWrite-Verbose\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;[{0}] - Entry added to logfile for user [{1}]\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-f\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eGet-Date\u003c/span\u003e \u003cspan class=\"n\"\u003e-Format\u003c/span\u003e \u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"nv\"\u003e$user\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eUserPrincipalName\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# Send Email Message if not disabled by switch\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"vm\"\u003e$null\u003c/span\u003e \u003cspan class=\"o\"\u003e-eq\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$TestMailDisabled\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003eSend-Mailmessage\u003c/span\u003e \u003cspan class=\"n\"\u003e-SmtpServer\u003c/span\u003e \u003cspan class=\"nv\"\u003e$smtpServer\u003c/span\u003e \u003cspan class=\"n\"\u003e-From\u003c/span\u003e \u003cspan class=\"nv\"\u003e$from\u003c/span\u003e \u003cspan class=\"n\"\u003e-To\u003c/span\u003e \u003cspan class=\"nv\"\u003e$emailAddress\u003c/span\u003e \u003cspan class=\"n\"\u003e-Subject\u003c/span\u003e \u003cspan class=\"nv\"\u003e$subject\u003c/span\u003e \u003cspan class=\"n\"\u003e-Body\u003c/span\u003e \u003cspan class=\"nv\"\u003e$body\u003c/span\u003e \u003cspan class=\"n\"\u003e-BodyAsHTML\u003c/span\u003e \u003cspan class=\"n\"\u003e-Priority\u003c/span\u003e \u003cspan class=\"n\"\u003eHigh\u003c/span\u003e \u003cspan class=\"n\"\u003e-Encoding\u003c/span\u003e \u003cspan class=\"nv\"\u003e$textEncoding\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003eWrite-Verbose\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;[{0}] - Email sent to [{1}]\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-f\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eGet-Date\u003c/span\u003e \u003cspan class=\"n\"\u003e-Format\u003c/span\u003e \u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"nv\"\u003e$emailAddress\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e# End Send Message\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# Log Non Expiring Password\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nv\"\u003e$sent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;No\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c\"\u003e# If Logging is Enabled Log Details\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$Logging\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003eAdd-Content\u003c/span\u003e \u003cspan class=\"nv\"\u003e$logFile\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$logDate\u003c/span\u003e\u003cspan class=\"s2\"\u003e,\u003c/span\u003e\u003cspan class=\"nv\"\u003e$name\u003c/span\u003e\u003cspan class=\"s2\"\u003e,\u003c/span\u003e\u003cspan class=\"nv\"\u003e$emailAddress\u003c/span\u003e\u003cspan class=\"s2\"\u003e,\u003c/span\u003e\u003cspan class=\"nv\"\u003e$daysToExpire\u003c/span\u003e\u003cspan class=\"s2\"\u003e,\u003c/span\u003e\u003cspan class=\"nv\"\u003e$expiresOn\u003c/span\u003e\u003cspan class=\"s2\"\u003e,\u003c/span\u003e\u003cspan class=\"nv\"\u003e$sent\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nb\"\u003eWrite-Verbose\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;[{0}] - Entry added to logfile for user [{1}]\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-f\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eGet-Date\u003c/span\u003e \u003cspan class=\"n\"\u003e-Format\u003c/span\u003e \u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"nv\"\u003e$user\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eUserPrincipalName\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"c\"\u003e# End User Processing\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$verbosePreference\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;SilentlyContinue\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# End\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\r\n\u003c/div\u003e\r\n",
"language": "en"
},
{
"title" : "Custom Domain Names With Azurewebsites",
"date_published" : "2016-06-16T15:13:27+02:00",
"date_modified" : "2016-06-16T15:13:27+02:00",
"id" : "https://bearman.nl/2016/06/16/custom-domain-names-with-azurewebsites/",
"url" : "https://bearman.nl/2016/06/16/custom-domain-names-with-azurewebsites/",
"summary": "\rCustom Domain names\rAzure WebsitesI\u0026rsquo;ve only recently set up this blog and since it\u0026rsquo;s always busy at work, I don\u0026rsquo;t always have the time to sort out those \u0026rsquo;nice to haves\u0026rsquo;. I\u0026rsquo;m hosting this blog using AzureWebsites, but obviously I use my own domain name. My pain? For the life of me I couldn\u0026rsquo;t figure out the magic rule to rewrite my x.azurewebsites.net url to the proper \u0026lsquo;bearman.nl\u0026rsquo; hostname I\u0026rsquo;m using now. Shame on me, Microsoft consultant couldn\u0026rsquo;t figure out a simple IIS redirect rule\u0026hellip; In my defense, I hadn\u0026rsquo;t really taken the time to do it properly and I had in fact solved it, but in the wrong order. To setup an AzureWebsite using a custom domain you need to configure it in several places:\n",
"content_html" : "\u003ch1 id=\"custom-domain-names\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#custom-domain-names\" class=\"header-mark\"\u003e\u003c/a\u003eCustom Domain names\u003c/h1\u003e\u003ch2 id=\"azure-websites\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#azure-websites\" class=\"header-mark\"\u003e\u003c/a\u003eAzure Websites\u003c/h2\u003e\u003cp\u003eI\u0026rsquo;ve only recently set up this blog and since it\u0026rsquo;s always busy at work, I don\u0026rsquo;t always have the time to sort out those \u0026rsquo;nice to haves\u0026rsquo;. I\u0026rsquo;m hosting this blog using AzureWebsites, but obviously I use my own domain name. My pain? For the life of me I couldn\u0026rsquo;t figure out the magic rule to rewrite my x.azurewebsites.net url to the proper \u0026lsquo;bearman.nl\u0026rsquo; hostname I\u0026rsquo;m using now. Shame on me, Microsoft consultant couldn\u0026rsquo;t figure out a simple IIS redirect rule\u0026hellip; In my defense, I hadn\u0026rsquo;t really taken the time to do it properly and I had in fact solved it, but in the wrong order. To setup an AzureWebsite using a custom domain you need to configure it in several places:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIn the Azure portal;\u003c/li\u003e\n\u003cli\u003eDNS records with your domain registrar;\u003c/li\u003e\n\u003cli\u003eIn your application, in my case WordPress;\u003c/li\u003e\n\u003cli\u003eAn IIS rule to do the actual rewrite/redirect.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"setting-the-configuration\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#setting-the-configuration\" class=\"header-mark\"\u003e\u003c/a\u003eSetting the configuration\u003c/h2\u003e\u003cp\u003eWhere to configure in Azure? In the Azure Portal find your Web App settings and under the Routing header click on Custom Domains and SSL. Select Bring External Domain and follow the instructions. Pay attention to using the correct type of DNS records, A records and CNAME records, depending on the correct entry. With your domain registrar find the DNS Manager to actually enter the records. You need to set the awverify.*.azurewebsites.net record with a CNAME to verify your custom domain with Azure. I went and created an A record for my domain to the AzureWebsite. Most registrars provide a warning stating you need to wait a maximum of up to 24 hours before the records are updated, in my case they were available within a minute, this may vary based on the receiving location however. In your application add your custom domain, in the case of WordPress go to General Settings and edit your WordPress Address (URL) and Site Address (URL) accordingly. Finally comes the last bit of magic, the IIS rewrite rule. Kudo\u0026rsquo;s to the \u003ca href=\"http://onthecloud.azurewebsites.net/seo-tip-how-to-block-the-.azurewebsites.net-domain\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eauthor of the solution\u003c/a\u003e for the final makeup of the IIS rule and \u003ca href=\"http://www.devjev.nl/\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eDevJev\u003c/a\u003e for nudging me in the right direction :-)\u003c/p\u003e\n\u003cdiv class=\"code-block highlight is-closed show-line-numbers tw-group tw-my-2\"\u003e\r\n \u003cdiv class=\"\r\n \r\n tw-flex \r\n tw-flex-row\r\n tw-flex-1 \r\n tw-justify-between \r\n tw-w-full tw-bg-bgColor-secondary\r\n \"\u003e \r\n \u003cbutton \r\n class=\"\r\n code-block-button\r\n tw-mx-2 \r\n tw-flex\r\n tw-flex-row\r\n tw-flex-1\"\r\n aria-hidden=\"true\"\u003e\r\n \u003cdiv class=\"group-[.is-open]:tw-rotate-90 tw-transition-[transform] tw-duration-500 tw-ease-in-out print:!tw-hidden tw-w-min tw-h-min tw-my-1 tw-mx-1\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M285.476 272.971L91.132 467.314c-9.373 9.373-24.569 9.373-33.941 0l-22.667-22.667c-9.357-9.357-9.375-24.522-.04-33.901L188.505 256 34.484 101.255c-9.335-9.379-9.317-24.544.04-33.901l22.667-22.667c9.373-9.373 24.569-9.373 33.941 0L285.475 239.03c9.373 9.372 9.373 24.568.001 33.941z\"/\u003e\u003c/svg\u003e\u003c/div\u003e\r\n \u003cp class=\"tw-select-none !tw-my-1\"\u003exml\u003c/p\u003e\r\n \u003c/button\u003e\r\n\r\n \u003cdiv class=\"tw-flex\"\u003e\r\n \u003cbutton \r\n class=\"\r\n line-number-button\r\n tw-mx-2 \r\n tw-hidden \r\n group-[.is-open]:tw-block \r\n group-[.show-line-numbers]:tw-text-fgColor-link \r\n print:!tw-hidden\" \r\n title=\"Toggle line numbers\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M61.77 401l17.5-20.15a19.92 19.92 0 0 0 5.07-14.19v-3.31C84.34 356 80.5 352 73 352H16a8 8 0 0 0-8 8v16a8 8 0 0 0 8 8h22.83a157.41 157.41 0 0 0-11 12.31l-5.61 7c-4 5.07-5.25 10.13-2.8 14.88l1.05 1.93c3 5.76 6.29 7.88 12.25 7.88h4.73c10.33 0 15.94 2.44 15.94 9.09 0 4.72-4.2 8.22-14.36 8.22a41.54 41.54 0 0 1-15.47-3.12c-6.49-3.88-11.74-3.5-15.6 3.12l-5.59 9.31c-3.72 6.13-3.19 11.72 2.63 15.94 7.71 4.69 20.38 9.44 37 9.44 34.16 0 48.5-22.75 48.5-44.12-.03-14.38-9.12-29.76-28.73-34.88zM496 224H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM16 160h64a8 8 0 0 0 8-8v-16a8 8 0 0 0-8-8H64V40a8 8 0 0 0-8-8H32a8 8 0 0 0-7.14 4.42l-8 16A8 8 0 0 0 24 64h8v64H16a8 8 0 0 0-8 8v16a8 8 0 0 0 8 8zm-3.91 160H80a8 8 0 0 0 8-8v-16a8 8 0 0 0-8-8H41.32c3.29-10.29 48.34-18.68 48.34-56.44 0-29.06-25-39.56-44.47-39.56-21.36 0-33.8 10-40.46 18.75-4.37 5.59-3 10.84 2.8 15.37l8.58 6.88c5.61 4.56 11 2.47 16.12-2.44a13.44 13.44 0 0 1 9.46-3.84c3.33 0 9.28 1.56 9.28 8.75C51 248.19 0 257.31 0 304.59v4C0 316 5.08 320 12.09 320z\"/\u003e\u003c/svg\u003e\u003c/button\u003e\r\n\r\n \u003cbutton \r\n class=\"\r\n wrap-code-button\r\n tw-select-none \r\n tw-mx-2 \r\n tw-hidden \r\n group-[.is-open]:tw-block \r\n group-[.is-wrap]:tw-text-fgColor-link \r\n print:!tw-hidden\" \r\n title=\"Toggle code wrap\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z\"/\u003e\u003c/svg\u003e\u003c/button\u003e\r\n \r\n \u003cbutton \r\n class=\"\r\n copy-code-button\r\n tw-select-none\r\n tw-mx-2 \r\n tw-hidden\r\n group-[.is-open]:tw-block\r\n hover:tw-text-fgColor-link \r\n print:!tw-hidden\"\r\n title=\"Copy code\"\u003e\r\n \u003cspan class=\"copy-icon tw-block\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z\"/\u003e\u003c/svg\u003e\u003c/span\u003e\r\n \u003cspan class=\"check-icon tw-hidden\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\"/\u003e\u003c/svg\u003e\u003c/span\u003e\r\n \u003c/button\u003e\r\n \r\n \u003cbutton \r\n class=\"\r\n tw-select-none \r\n tw-mx-2 \r\n tw-block \r\n group-[.is-open]:tw-hidden \r\n print:!tw-hidden\" \r\n disabled\r\n aria-hidden=\"true\"\u003e\u003csvg class=\"icon\"\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"\u003e\u003c!-- Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --\u003e\u003cpath d=\"M328 256c0 39.8-32.2 72-72 72s-72-32.2-72-72 32.2-72 72-72 72 32.2 72 72zm104-72c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72zm-352 0c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72z\"/\u003e\u003c/svg\u003e\u003c/button\u003e\r\n \u003c/div\u003e\r\n \u003c/div\u003e\r\n \u003cpre style=\"counter-reset: codeblock;\" class=\"tw-block tw-m-0 tw-p-0\"\u003e\u003ccode \r\n id=\"codeblock-id-1\" \r\n class=\"\r\n chroma \r\n !tw-block \r\n tw-p-0\r\n tw-m-0\r\n tw-transition-[max-height] \r\n tw-duration-500 \r\n tw-ease-in-out \r\n group-[.is-closed]:!tw-max-h-0 \r\n group-[.is-wrap]:tw-text-wrap\r\n tw-overflow-y-hidden\r\n tw-overflow-x-auto\r\n tw-scrollbar-thin\r\n \"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nt\"\u003e\u0026lt;configuration\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nt\"\u003e\u0026lt;system.webServer\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nt\"\u003e\u0026lt;rewrite\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nt\"\u003e\u0026lt;rules\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nt\"\u003e\u0026lt;rule\u003c/span\u003e \u003cspan class=\"na\"\u003ename=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Disable Azure Domain\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003epatternSyntax=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Wildcard\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003estopProcessing=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nt\"\u003e\u0026lt;match\u003c/span\u003e \u003cspan class=\"na\"\u003eurl=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;*\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nt\"\u003e\u0026lt;conditions\u003c/span\u003e \u003cspan class=\"na\"\u003elogicalGrouping=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;MatchAll\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003etrackAllCaptures=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;false\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nt\"\u003e\u0026lt;add\u003c/span\u003e \u003cspan class=\"na\"\u003einput=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;{HTTP_HOST}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003epattern=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;*.azurewebsites.net\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nt\"\u003e\u0026lt;/conditions\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nt\"\u003e\u0026lt;action\u003c/span\u003e \u003cspan class=\"na\"\u003etype=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Redirect\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eurl=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;http://www.mysite.com{REQUEST_URI}\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eredirectType=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Permanent\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nt\"\u003e\u0026lt;/rule\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nt\"\u003e\u0026lt;/rules\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nt\"\u003e\u0026lt;/rewrite\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nt\"\u003e\u0026lt;/system.webServer\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"nt\"\u003e\u0026lt;/configuration\u0026gt;\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\r\n\u003c/div\u003e\r\n\u003cp\u003eSo why couldn\u0026rsquo;t I figure this last bit of magic out on my own\u0026hellip; I tried to set this up \u003cem\u003ebefore completing the other steps\u003c/em\u003e. Working on this yourself? Sort your Azure, DNS and WordPress config first!\u003c/p\u003e\n",
"language": "en"
},
{
"title" : "SfB HA SQL DAG Configuration",
"date_published" : "2016-05-26T14:45:26+02:00",
"date_modified" : "2016-05-26T14:45:26+02:00",
"id" : "https://bearman.nl/2016/05/26/sfb-ha-sql-dag-configuration/",
"url" : "https://bearman.nl/2016/05/26/sfb-ha-sql-dag-configuration/",
"summary": "\rSkype for Business: High Availability SQL Database Availability Group Configuration\rOne of those silly mistakes…I’ve recently installed and configured a new Skype for Business landscape at my company. While implementing this I made one of those silly mistakes that cause you to spend hours looking for a solution… which is in fact one simple undocumented configuration setting. For our SfB configuration we use a high availability SQL cluster and we’ve also set up a Database Availability Group, or DAG. Once enabled, the first field gets relabeled ‘SQL Server Availability Group Listener FQDN’, the second ‘SQL Server FQDN’. Initially before enabling the DAG I set these values:\n",
"content_html" : "\u003ch1 id=\"skype-for-business-high-availability-sql-database-availability-group-configuration\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#skype-for-business-high-availability-sql-database-availability-group-configuration\" class=\"header-mark\"\u003e\u003c/a\u003eSkype for Business: High Availability SQL Database Availability Group Configuration\u003c/h1\u003e\u003ch2 id=\"one-of-those-silly-mistakes\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#one-of-those-silly-mistakes\" class=\"header-mark\"\u003e\u003c/a\u003e\u003cstrong\u003eOne of those silly mistakes…\u003c/strong\u003e\u003c/h2\u003e\u003cp\u003eI’ve recently installed and configured a new Skype for Business landscape at my company. While implementing this I made one of those silly mistakes that cause you to spend hours looking for a solution… which is in fact one simple undocumented configuration setting. For our SfB configuration we use a high availability SQL cluster and we’ve also set up a Database Availability Group, or DAG. Once enabled, the first field gets relabeled ‘SQL Server Availability Group Listener FQDN’, the second ‘SQL Server FQDN’. Initially before enabling the DAG I set these values:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eField 1, SQL Server DAG FQDN;\u003c/li\u003e\n\u003cli\u003eField 2, any given SQL Server node FQDN which will become part of the DAG.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWhich looks like this:\u003cbr\u003e\n\u003cimg class=\"tw-inline\" loading=\"lazy\" src='/2016/05/26/sfb-ha-sql-dag-configuration/DAG_Before.png' srcset=\"/2016/05/26/sfb-ha-sql-dag-configuration/DAG_Before_hu_d0e603522fd685c9.webp 800w, /2016/05/26/sfb-ha-sql-dag-configuration/DAG_Before_hu_574922b2d7aa503.webp 1200w, /2016/05/26/sfb-ha-sql-dag-configuration/DAG_Before_hu_45bba31349b166bb.webp 1600w\" alt=\"DAG before\" height=\"429\" width=\"562\"\u003e\u003c/p\u003e\n\u003cp\u003eAfter the installation was complete and my published topology was running I ran into all sorts of problems, the root of which was the SQL datasource being read-only. Shortly after I determined the errors went away for a while when I switched the active node in the SQL cluster, so \u003cem\u003esomething\u003c/em\u003e had to be wrong with those settings… \u003cstrong\u003ebut what\u003c/strong\u003e?!\u003c/p\u003e\n\u003ch2 id=\"the-fix\" class=\"headerLink\"\u003e\r\n \u003ca href=\"#the-fix\" class=\"header-mark\"\u003e\u003c/a\u003eThe fix\u003c/h2\u003e\u003cp\u003eSo what’s the correct configuration? After the initial installation of SfB \u003cem\u003eand\u003c/em\u003e finalizing the replication of all the databases for the SQL DAG, \u003cstrong\u003eyou need to change the SQL server FQDN back to the DAG FQDN.\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eField 1 requires, SQL Server DAG FQDN;\u003c/li\u003e\n\u003cli\u003eField 2 requires, SQL Server DAG FQDN.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg class=\"tw-inline\" loading=\"lazy\" src='/2016/05/26/sfb-ha-sql-dag-configuration/DAG_After.png' srcset=\"/2016/05/26/sfb-ha-sql-dag-configuration/DAG_After_hu_c2c3d8042b13d974.webp 800w, /2016/05/26/sfb-ha-sql-dag-configuration/DAG_After_hu_6774ccf24f6d3d96.webp 1200w, /2016/05/26/sfb-ha-sql-dag-configuration/DAG_After_hu_7d16d5b06db1ec62.webp 1600w\" alt=\"DAG after\" height=\"429\" width=\"562\"\u003e\u003c/p\u003e\n\u003cp\u003eWhy are there two fields for the same setting? You need to install the databases onto a single SQL node once before you can switch on the DAG settings, \u003cem\u003e\u003cstrong\u003ethen remember to reconfigure the SQL store in your SfB topology with the DAG FQDN\u003c/strong\u003e\u003c/em\u003e. Would be nice if the Microsoft documentation was explicit on the little things like these. One final tip, whenever you see a field that requires the \u003cstrong\u003eFQDN\u003c/strong\u003e, double check you \u003cem\u003eactually used the FQDN\u003c/em\u003e before publishing your topology. Changing the FQDN on the SQL Server store after the topology has been published can be a chore…\u003c/p\u003e\n",
"language": "en"
},
]
}