{"id":5098,"date":"2025-05-25T10:51:56","date_gmt":"2025-05-25T09:51:56","guid":{"rendered":"https:\/\/mortenknudsen.net\/?p=5098"},"modified":"2025-05-25T11:32:05","modified_gmt":"2025-05-25T10:32:05","slug":"tutorial-integration-ai-into-your-powershell-scripts","status":"publish","type":"post","link":"https:\/\/mortenknudsen.net\/?p=5098","title":{"rendered":"Tutorial: Integrate AI into your Powershell scripts"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">I have been playing around with integrating AI into my favorite scripting tool: Powershell.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This blog serves as a quick-guide of how you can get started.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Below is an video-example of an app I have created using Powershell and Azure OpenAI. I have provided samples script to get you started in this tutorial.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"PIM Role Advisor\" width=\"1200\" height=\"900\" src=\"https:\/\/www.youtube.com\/embed\/QbUJInHLBDc?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2728 Need I say, it is awesome to use AI in scripts taking troubleshooting, cost optimization, security hunting, compliance reporting to the next level &#8211; much faster and more detailed! Try it out for yourself\u2728<br><br>\ud83d\ude80 Happy Scripting with the power of AI \ud83d\ude03<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Samples with Video + Script<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>App<\/td><td>Script Purpose<\/td><\/tr><tr><td><a href=\"https:\/\/youtu.be\/QbUJInHLBDc\">PIM Role Advisor<\/a><br><a href=\"https:\/\/youtu.be\/QbUJInHLBDc\">(video &#8211; YouTube)<\/a><br><br><a href=\"https:\/\/raw.githubusercontent.com\/KnudsenMorten\/PIM-Role-Advisor\/refs\/heads\/main\/pim-role-advisor.ps1\" data-type=\"link\" data-id=\"https:\/\/raw.githubusercontent.com\/KnudsenMorten\/PIM-Role-Advisor\/refs\/heads\/main\/pim-role-advisor.ps1\">PIM-Role-Advisor<\/a><br><a href=\"https:\/\/raw.githubusercontent.com\/KnudsenMorten\/PIM-Role-Advisor\/refs\/heads\/main\/pim-role-advisor.ps1\" data-type=\"link\" data-id=\"https:\/\/raw.githubusercontent.com\/KnudsenMorten\/PIM-Role-Advisor\/refs\/heads\/main\/pim-role-advisor.ps1\">(script &#8211; Github)<\/a><\/td><td>Goal is to show-case how AI can show the necessary role and specific PIM group to activate.<br><br>App was created with 450 lines of Powershell &#8211; integrating with Azure Open AI, Microsoft Graph and enriched data with PIM assignments (Entra ID Role Assignments, Azure PIM Assignments, PIM groups, etc.). <\/td><\/tr><tr><td><a href=\"https:\/\/youtu.be\/jPoG8DX_MW8\">Sentinel Log Events Anomaly Detector<\/a><br><a href=\"https:\/\/youtu.be\/jPoG8DX_MW8\">(video &#8211; YouTube)<\/a><br><br><a href=\"https:\/\/raw.githubusercontent.com\/KnudsenMorten\/Sentinel-Log-Events-Anomaly-Detector\/refs\/heads\/main\/AI-Sentinel-Log-Events-Anomaly-Detector.ps1\">Sentinel Log Events Anomaly Detector<\/a><br><a href=\"https:\/\/raw.githubusercontent.com\/KnudsenMorten\/Sentinel-Log-Events-Anomaly-Detector\/refs\/heads\/main\/AI-Sentinel-Log-Events-Anomaly-Detector.ps1\">(script &#8211; Github)<\/a><\/td><td>Goal is to detect rogue apps, new policy config like AD audit or devices sending tons of data into logs increasing log costs significantly.<br><br>\u2139\ufe0f This app analyzes Sentinel LogAnalytics SecurityEvent table for sudden increase of log events per eventid\/server during last 1 hour and compares with average last 7 days.&nbsp;If thresholds of +20% is hit, events are being analyzed by Open AI and recommendations are shown with what to do. Summary is sent by email as an alert to IT. I\u2019m grounding\/providing context to the LLMs with focus on an cost-efficient prompt based on event samples.<br><br>\u26a1 NOTE: This is a quick sample; not a full blown anomaly detection method for Sentinel logs. Fine-tune it to your needs \ud83d\ude42<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Blog content (links)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"#backend\" data-type=\"internal\" data-id=\"#backend\">Backend &#8211; Azure Open AI instance<\/a><\/li>\n\n\n\n<li><a href=\"#script\" data-type=\"internal\" data-id=\"#script\">Script configuration<\/a><\/li>\n\n\n\n<li><a href=\"#cost\" data-type=\"internal\" data-id=\"#cost\">Cost of AI<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"backend\">Backend &#8211; Azure Open AI instance<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">First you need to deploy an Azure OpenAI instance for your AI prompts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Search for <strong>Open<\/strong> &#8211; and choose <strong>Azure OpenAI<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"169\" src=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-21-1024x169.png\" alt=\"\" class=\"wp-image-5114\" srcset=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-21-1024x169.png 1024w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-21-300x50.png 300w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-21-768x127.png 768w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-21-1536x254.png 1536w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-21-2048x339.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"590\" src=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-7-1024x590.png\" alt=\"\" class=\"wp-image-5099\" srcset=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-7-1024x590.png 1024w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-7-300x173.png 300w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-7-768x443.png 768w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-7-1536x886.png 1536w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-7-2048x1181.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Step 1: Create your <strong>Azure OpenAI instance<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"590\" src=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-8-1024x590.png\" alt=\"\" class=\"wp-image-5100\" srcset=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-8-1024x590.png 1024w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-8-300x173.png 300w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-8-768x443.png 768w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-8-1536x886.png 1536w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-8-2048x1181.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Step 2: Define <strong>network + tagging<\/strong> + <strong>deploy<\/strong> environment<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"590\" src=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-9-1024x590.png\" alt=\"\" class=\"wp-image-5101\" srcset=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-9-1024x590.png 1024w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-9-300x173.png 300w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-9-768x443.png 768w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-9-1536x886.png 1536w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-9-2048x1181.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Step 3: Go into resource<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"590\" src=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-10-1024x590.png\" alt=\"\" class=\"wp-image-5102\" srcset=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-10-1024x590.png 1024w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-10-300x173.png 300w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-10-768x443.png 768w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-10-1536x886.png 1536w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-10-2048x1181.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Step 4: Go into<strong> Azure AI Foundry Portal<\/strong> &#8211; as we need to setup <strong>Deployment model<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"590\" src=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-11-1024x590.png\" alt=\"\" class=\"wp-image-5103\" srcset=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-11-1024x590.png 1024w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-11-300x173.png 300w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-11-768x443.png 768w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-11-1536x886.png 1536w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-11-2048x1181.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Step 5: Create <strong>Deployment model<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"590\" src=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-12-1024x590.png\" alt=\"\" class=\"wp-image-5104\" srcset=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-12-1024x590.png 1024w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-12-300x173.png 300w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-12-768x443.png 768w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-12-1536x886.png 1536w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-12-2048x1181.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Step 6: Choose <strong>model of choice<\/strong> &#8211; I use <strong>gpt-4o-mini<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"590\" src=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-13-1024x590.png\" alt=\"\" class=\"wp-image-5105\" srcset=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-13-1024x590.png 1024w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-13-300x173.png 300w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-13-768x443.png 768w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-13-1536x886.png 1536w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-13-2048x1181.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Step 7: Choose <strong>Deployment Type<\/strong> &#8211; I use <strong>Global Standard<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"590\" src=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-14-1024x590.png\" alt=\"\" class=\"wp-image-5106\" srcset=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-14-1024x590.png 1024w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-14-300x173.png 300w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-14-768x443.png 768w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-14-1536x886.png 1536w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-14-2048x1181.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Step 10: Now we need to find out our <strong>endpoint URL <\/strong>and <strong>access key<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Click at <strong>Deployments<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Choose the <strong>Model Deployment<\/strong>, you just deployed like gpt-4o-mini<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"590\" src=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-19-1024x590.png\" alt=\"\" class=\"wp-image-5111\" srcset=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-19-1024x590.png 1024w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-19-300x173.png 300w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-19-768x443.png 768w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-19-1536x886.png 1536w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-19-2048x1181.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Note down your <strong>API key (Access Key)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Note down your <strong>endpoint target uri<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"590\" src=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-20-1024x590.png\" alt=\"\" class=\"wp-image-5112\" srcset=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-20-1024x590.png 1024w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-20-300x173.png 300w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-20-768x443.png 768w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-20-1536x886.png 1536w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-20-2048x1181.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Good job &#8211; now your are finished with the backend !<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"script\">Script configuration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use the variables you noted down above in the header of the script<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I have provided 2 scripts for you to try and get started.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>Script Name<\/td><td>Script Purpose<\/td><\/tr><tr><td><a href=\"https:\/\/raw.githubusercontent.com\/KnudsenMorten\/PIM-Role-Advisor\/refs\/heads\/main\/pim-role-advisor.ps1\" data-type=\"link\" data-id=\"https:\/\/raw.githubusercontent.com\/KnudsenMorten\/PIM-Role-Advisor\/refs\/heads\/main\/pim-role-advisor.ps1\">PIM-Role-Advisor<\/a><\/td><td>Show PIM role to solve a task &#8211; and group to activate the needed permission<\/td><\/tr><tr><td><a href=\"https:\/\/raw.githubusercontent.com\/KnudsenMorten\/Sentinel-Log-Events-Anomaly-Detector\/refs\/heads\/main\/AI-Sentinel-Log-Events-Anomaly-Detector.ps1\">Sentinel Log Events Anomaly Detector<\/a><\/td><td>Detect top-5 anomalies in events &#8211; and use AI to understand what to do, based on sample events<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Example of header<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code># -------------------- Tenant Configuration --------------------\n$tenantId         = \"&lt;your-tenant-id&gt;\"  # e.g. \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"\n\n# -------------------- Sentinel Configuration --------------------\n$subscriptionId   = \"&lt;your-subscription-id&gt;\"  # e.g. \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\"\n$resourceGroup    = \"&lt;your-resource-group-name&gt;\"  # e.g. \"rg-sentinel-logs\"\n$workspaceName    = \"&lt;your-log-analytics-workspace-name&gt;\"  # e.g. \"la-sentinel\"\n\n# -------------------- OpenAI Configuration --------------------\n$openaiApiKey     = \"&lt;your-azure-openai-api-key&gt;\"  # Create from Azure OpenAI resource\n$openaiDeployment = \"&lt;your-deployment-name&gt;\"       # e.g. \"gpt-4o-mini\"\n$openaiEndpoint   = \"&lt;your-endpoint-url&gt;\"          # e.g. \"https:\/\/your-resource-name.openai.azure.com\"\n$openaiApiVersion = \"2024-03-01-preview\"           # Use appropriate version\n$openaiUri        = \"$openaiEndpoint\/openai\/deployments\/$openaiDeployment\/chat\/completions?api-version=$openaiApiVersion\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"cost\">Cost of AI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">As you can see the cost of AI for my purpose is pretty low.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I pay <strong>USD 0.23<\/strong> for <strong>77 requests<\/strong> with total of approx <strong>2m tokens<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"957\" height=\"137\" src=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-23.png\" alt=\"\" class=\"wp-image-5119\" srcset=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-23.png 957w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-23-300x43.png 300w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-23-768x110.png 768w\" sizes=\"auto, (max-width: 957px) 100vw, 957px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"519\" src=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-22-1024x519.png\" alt=\"\" class=\"wp-image-5118\" srcset=\"https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-22-1024x519.png 1024w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-22-300x152.png 300w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-22-768x389.png 768w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-22-1536x778.png 1536w, https:\/\/mortenknudsen.net\/wp-content\/uploads\/2025\/05\/image-22.png 1851w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>I have been playing around with integrating AI into my favorite scripting tool: Powershell. This blog serves as a quick-guide &#8230; <\/p>\n<p class=\"read-more-container\"><a title=\"Tutorial: Integrate AI into your Powershell scripts\" class=\"read-more button\" href=\"https:\/\/mortenknudsen.net\/?p=5098#more-5098\" aria-label=\"Read more about Tutorial: Integrate AI into your Powershell scripts\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"ngg_post_thumbnail":0,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[202,55,163,164,60,132,58],"tags":[199,18,104,200,17,24,201],"class_list":["post-5098","post","type-post","status-publish","format-standard","hentry","category-ai","category-azure","category-identity","category-identity-2","category-scripting","category-security","category-sentinel","tag-ai","tag-azure","tag-cost","tag-identity","tag-security","tag-sentinel","tag-tutorial","infinite-scroll-item"],"featured_image_src":null,"author_info":{"display_name":"Morten Knudsen","author_link":"https:\/\/mortenknudsen.net\/?author=1"},"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/mortenknudsen.net\/index.php?rest_route=\/wp\/v2\/posts\/5098","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mortenknudsen.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mortenknudsen.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mortenknudsen.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mortenknudsen.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5098"}],"version-history":[{"count":7,"href":"https:\/\/mortenknudsen.net\/index.php?rest_route=\/wp\/v2\/posts\/5098\/revisions"}],"predecessor-version":[{"id":5125,"href":"https:\/\/mortenknudsen.net\/index.php?rest_route=\/wp\/v2\/posts\/5098\/revisions\/5125"}],"wp:attachment":[{"href":"https:\/\/mortenknudsen.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5098"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mortenknudsen.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5098"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mortenknudsen.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5098"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}