Skip to content

Instantly share code, notes, and snippets.

View ehrnst's full-sized avatar

Martin Ehrnst ehrnst

View GitHub Profile
@ehrnst
ehrnst / appRegistrationSignIns.ps1
Last active March 10, 2026 16:18
Get sign in information for app registrations and service principals through EntraID/Log Analytics
<#
.SYNOPSIS
This script retrieves Azure Active Directory (AD) applications with expired secrets and checks their sign-in logs.
.DESCRIPTION
The script first retrieves all Azure AD applications using the Get-AzADApplication cmdlet. It then filters these applications to only include those where the password credential has expired more than 30 days ago and where there is only one password credential.
For each of these applications, the script retrieves the AppId and constructs three queries to check the sign-in logs for the last 30 days. The queries are for service principal sign-ins, non-interactive user sign-ins, and interactive sign-ins.
The script then executes these queries using the Invoke-AzOperationalInsightsQuery cmdlet and stores the results in three separate variables: $servicePrincipalSignins, $nonInteractiveSignins, and $interactiveSignins.
Finally, the script outputs the results of these queries.
@ehrnst
ehrnst / reqCertFromTemplate.ps1
Last active June 11, 2025 11:00
Request and install a certificate from template using powershell
# Request the certificate throuh template called "WebServer"
Get-Certificate -Template "WebServer" -DnsName "computername.fqdn" -CertStoreLocation cert:\LocalMachine\My -SubjectName "CN=computerName.fqdn, C=CountryCode, L=MyCity, O=Organization OU=Department, S=State"
# After approval. Use request to download and install cert
$cert = (get-childItem -path cert:\LocalMachine\Request)
get-certificate -Request cert:\LocalMachine\Request\$cert
@ehrnst
ehrnst / canary-deployment.yaml
Created January 28, 2025 18:59
Kubernetes canary deployments with NGINX. No Flagger or Argo
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo-canary
spec:
replicas: 1
selector:
matchLabels:
app: echo
version: canary
@ehrnst
ehrnst / prometheusRecordingRules.bicep
Created November 4, 2024 15:42
Prometheus recording rules for Azure managed Prometheus
param devPrometheusWorkspaceId string
param prodPrometheusWorkspaceId string
param resourceLocation string = resourceGroup().location
param tags object
var nodeRecordingRuleGroupDescription = 'Node Exporter recording rules for Prometheus '
var version = '1.0'
resource nodeRecordingRuleGroupDev 'Microsoft.AlertsManagement/prometheusRuleGroups@2023-03-01' = {
name: 'NodeRecordingRulesRuleGroup-linux-dev'
@ehrnst
ehrnst / migrate-devops-repo.ps1
Created February 16, 2024 10:57
PowerShell script using GH CLI to migrate Azure DevOps repositories to GitHub
param(
[Parameter(HelpMessage="The Azure DevOps organization.")]
[string]$adoOrg = "Adatum",
[Parameter(Mandatory=$true, HelpMessage="The Azure DevOps team project.")]
[string]$adoTeamProject,
[Parameter(Mandatory=$true, HelpMessage="The Azure DevOps repository.")]
[string]$adoRepo,
@ehrnst
ehrnst / Azure-graph-partnerCenter-examples.ps1
Last active November 9, 2023 14:11
CSP Secure app model with Powershell
# Connect to partner center via refresh token
# Considering the refresh token is stored securely. We will have to get a new access token.
$clientId = {multi tenant app id}
$secret = {multi tnant app secret}
$partnerAccessTokenUri = "https://login.windows.net/$partnerTenant/oauth2/token"
$params = @{
resource = "https://api.partnercenter.microsoft.com";
grant_type = "refresh_token";
@ehrnst
ehrnst / start-policyRemediation.ps1
Created June 11, 2020 13:10
Create Azure policy set remediation task with powershell https://adatum.no/?p=6903
# in case you have multiple subscriptions...
select-azsubscription -SubscriptionName "SubscriptionName"
# get all non-compliant policies that can be remediated
$nonCompliantPolicies = Get-AzPolicyState | Where-Object { $_.ComplianceState -eq "NonCompliant" -and $_.PolicyDefinitionAction -eq "deployIfNotExists" }
# loop through ans start individual tasks per policy
foreach ($policy in $nonCompliantPolicies) {
$remediationName = "rem." + $policy.PolicyDefinitionName
@ehrnst
ehrnst / azopenai-slack.ps1
Last active April 24, 2023 12:36
Azure OpenAI Slack summary using PowerShell
# slack test
$slackKey = Get-AzKeyVaultsecret -VaultName "" -Name "" -AsPlainText
$azOpenAiKey = Get-AzKeyVaultsecret -VaultName "" -Name "" -AsPlainText
$slackChannelId = ""
$slackThreadId = ""
$openAiUrl = ""
$slackUrl = "https://slack.com/api/conversations.replies?channel=$slackChannelId&ts=$slackThreadId&pretty=1"
$slackHeaders= @{
"Authorization" = "Bearer $slackKey"
@ehrnst
ehrnst / containertest.bicep
Created June 16, 2022 07:02
bicep alter params to sub modules
param storageAccountName string
resource container 'Microsoft.Storage/storageAccounts/blobServices/containers@2021-09-01' = {
name: '${storageAccountName}/default/mycontainer'
}
@ehrnst
ehrnst / Get-PCAAppUserAuthenticationBearer.ps1
Last active December 23, 2022 01:12
Create a token to authenticate against microsoft partner center API as App + User
function Get-PCAppUserAuthenticationBearer {
<#
.SYNOPSIS
Function to retrieve App+User bearer token from Microsoft CSP API
.DESCRIPTION
This function connects to Azure AD to generate an oAuth token.
Aquired token is then used against the partner center REST API to generate a App+User jwt token. https://api.partnercenter.microsoft.com/generatetoken
You can read more about the authentication method here: https://msdn.microsoft.com/en-us/library/partnercenter/mt634709.aspx
.PARAMETER ClientID