Congratulations!

[Valid RSS] This is a valid RSS feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: https://www.toddklindt.com/feed/

  1. <?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
  2. xmlns:content="http://purl.org/rss/1.0/modules/content/"
  3. xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  4. xmlns:dc="http://purl.org/dc/elements/1.1/"
  5. xmlns:atom="http://www.w3.org/2005/Atom"
  6. xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  7. xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  8. >
  9.  
  10. <channel>
  11. <title>Todd Klindt&#039;s Blog</title>
  12. <atom:link href="https://www.toddklindt.com/feed/" rel="self" type="application/rss+xml" />
  13. <link>https://www.toddklindt.com/</link>
  14. <description>My new WordPress website</description>
  15. <lastBuildDate>Fri, 05 Sep 2025 16:18:35 +0000</lastBuildDate>
  16. <language>en-US</language>
  17. <sy:updatePeriod>
  18. hourly </sy:updatePeriod>
  19. <sy:updateFrequency>
  20. 1 </sy:updateFrequency>
  21. <generator>https://wordpress.org/?v=6.8.2</generator>
  22.  
  23. <image>
  24. <url>https://www.toddklindt.com/wp-content/uploads/2025/07/cropped-bird_desktop-Square-1-32x32.jpg</url>
  25. <title>Todd Klindt&#039;s Blog</title>
  26. <link>https://www.toddklindt.com/</link>
  27. <width>32</width>
  28. <height>32</height>
  29. </image>
  30. <item>
  31. <title>Free Microsoft 365 Copilot Challenges for Enterprise Organizations webinar with me!</title>
  32. <link>https://www.toddklindt.com/2025/09/05/free-microsoft-365-copilot-challenges-for-enterprise-organizations-webinar-with-me/</link>
  33. <comments>https://www.toddklindt.com/2025/09/05/free-microsoft-365-copilot-challenges-for-enterprise-organizations-webinar-with-me/#respond</comments>
  34. <dc:creator><![CDATA[Todd]]></dc:creator>
  35. <pubDate>Fri, 05 Sep 2025 16:17:19 +0000</pubDate>
  36. <category><![CDATA[Speaking Engagements]]></category>
  37. <guid isPermaLink="false">https://www.toddklindt.com/?p=312</guid>
  38.  
  39. <description><![CDATA[<p>My Sympraxis buddy Marc Anderson and I will be putting on a free webinar next week along with Syskit and we&#8217;d love each and every one of you to join us! It&#8217;s all about Microsoft 365 Copilot and the challenges you might face in your environment and how to deal with them. When is this [&#8230;]</p>
  40. <p>The post <a href="https://www.toddklindt.com/2025/09/05/free-microsoft-365-copilot-challenges-for-enterprise-organizations-webinar-with-me/">Free Microsoft 365 Copilot Challenges for Enterprise Organizations webinar with me!</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  41. ]]></description>
  42. <content:encoded><![CDATA[
  43. <p>My <a href="https://www.sympraxisconsulting.com/">Sympraxis</a> buddy <a href="https://sympmarc.com/">Marc Anderson</a> and I will be putting on a free webinar next week along with <a href="https://www.syskit.com/">Syskit</a> and we&#8217;d love each and every one of you to join us! It&#8217;s all about Microsoft 365 Copilot and the challenges you might face in your environment and how to deal with them. </p>
  44.  
  45.  
  46.  
  47. <p><strong>When is this amazing event?</strong></p>
  48.  
  49.  
  50.  
  51. <p>Wednesday, September 10th, 9:00 am (America/Chicago)</p>
  52.  
  53.  
  54.  
  55. <p><strong>How much is it?</strong></p>
  56.  
  57.  
  58.  
  59. <p>Free (as in beer)</p>
  60.  
  61.  
  62.  
  63. <p><strong>No way! How do I sign up??</strong></p>
  64.  
  65.  
  66.  
  67. <p>Go to <a href="https://www.syskit.com/webinars/microsoft-365-copilot-challenges/?utm_source=toddklindt&amp;utm_medium=social&amp;utm_campaign=166943954-Webinar-M365-Copilot-Enterprise-Challenges-09-2025-sep-point&amp;utm_content=Link-3096">this page and click</a> &#8220;Save your spot.&#8221; The folks at Syskit will do the rest. They&#8217;re the best, aren&#8217;t they?</p>
  68.  
  69.  
  70.  
  71. <p>If you have any questions hit me up on Twitter or Bluesky. </p>
  72.  
  73.  
  74.  
  75. <p>tk</p>
  76.  
  77.  
  78.  
  79. <p></p>
  80.  
  81.  
  82.  
  83. <p></p>
  84. <p>The post <a href="https://www.toddklindt.com/2025/09/05/free-microsoft-365-copilot-challenges-for-enterprise-organizations-webinar-with-me/">Free Microsoft 365 Copilot Challenges for Enterprise Organizations webinar with me!</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  85. ]]></content:encoded>
  86. <wfw:commentRss>https://www.toddklindt.com/2025/09/05/free-microsoft-365-copilot-challenges-for-enterprise-organizations-webinar-with-me/feed/</wfw:commentRss>
  87. <slash:comments>0</slash:comments>
  88. </item>
  89. <item>
  90. <title>New Blog</title>
  91. <link>https://www.toddklindt.com/2025/07/28/new-blog/</link>
  92. <comments>https://www.toddklindt.com/2025/07/28/new-blog/#respond</comments>
  93. <dc:creator><![CDATA[Todd]]></dc:creator>
  94. <pubDate>Mon, 28 Jul 2025 17:31:00 +0000</pubDate>
  95. <category><![CDATA[Uncategorized]]></category>
  96. <guid isPermaLink="false">https://www.toddklindt.com/?p=13</guid>
  97.  
  98. <description><![CDATA[<p>I&#8217;ve moved my blog over to WordPress because of the nasty SharePoint exploit that my beloved SharePoint 2010 is vulnerable to. While SharePoint is a fine blogging platform, I thought I&#8217;d go with something a little more conventional since I have to move. I&#8217;ll be spending the next few weeks figuring out how to get [&#8230;]</p>
  99. <p>The post <a href="https://www.toddklindt.com/2025/07/28/new-blog/">New Blog</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  100. ]]></description>
  101. <content:encoded><![CDATA[
  102. <p>I&#8217;ve moved <a href="https://www.toddklindt.com">my blog</a> over to WordPress because of the nasty SharePoint exploit that my beloved SharePoint 2010 is vulnerable to. While SharePoint is a fine blogging platform, I thought I&#8217;d go with something a little more conventional since I have to move. I&#8217;ll be spending the next few weeks figuring out how to get this all set up and getting my content moved over. Thanks for your patience.</p>
  103.  
  104.  
  105.  
  106. <p>tk</p>
  107. <p>The post <a href="https://www.toddklindt.com/2025/07/28/new-blog/">New Blog</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  108. ]]></content:encoded>
  109. <wfw:commentRss>https://www.toddklindt.com/2025/07/28/new-blog/feed/</wfw:commentRss>
  110. <slash:comments>0</slash:comments>
  111. </item>
  112. <item>
  113. <title>PowerShell Script to Download all Documents from all Doclibs, Versions Included</title>
  114. <link>https://www.toddklindt.com/2024/12/12/powershell-script-to-download-all-documents-from-all-doclibs-versions-included/</link>
  115. <comments>https://www.toddklindt.com/2024/12/12/powershell-script-to-download-all-documents-from-all-doclibs-versions-included/#respond</comments>
  116. <dc:creator><![CDATA[Todd]]></dc:creator>
  117. <pubDate>Thu, 12 Dec 2024 18:25:23 +0000</pubDate>
  118. <category><![CDATA[Office 365]]></category>
  119. <category><![CDATA[PowerShell]]></category>
  120. <category><![CDATA[SharePoint]]></category>
  121. <guid isPermaLink="false">https://www.toddklindt.com/?p=15</guid>
  122.  
  123. <description><![CDATA[<p>I recently saw a post (maybe on&#160;Reddit) where someone was asking for a script that would download all the files in a SharePoint site. I found myself with a few spare minutes and an open ChatGPT window, so I took a swing at it.&#160;I think the results turned out pretty well. I do want to [&#8230;]</p>
  124. <p>The post <a href="https://www.toddklindt.com/2024/12/12/powershell-script-to-download-all-documents-from-all-doclibs-versions-included/">PowerShell Script to Download all Documents from all Doclibs, Versions Included</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  125. ]]></description>
  126. <content:encoded><![CDATA[
  127. <p>I recently saw a post (maybe on&nbsp;<a href="https://www.reddit.com/r/sharepoint/">Reddit</a>) where someone was asking for a script that would download all the files in a SharePoint site. I found myself with a few spare minutes and an open ChatGPT window, so I took a swing at it.&nbsp;I think the results turned out pretty well. I do want to give a shout out to the Salaudeen Rajack at&nbsp;<a href="https://www.sharepointdiary.com/">SharePoint Diary</a>. We did get some help from&nbsp;<a href="https://www.sharepointdiary.com/2018/06/sharepoint-online-download-all-versions-using-powershell.html">this script</a>&nbsp;of his.</p>
  128.  
  129.  
  130.  
  131. <p>To give the script a wider audience, I submitted it to the&nbsp;<a href="https://pnp.github.io/script-samples/index.html">PnP Script Samples Gallery</a>.&nbsp;<strong>You can&nbsp;</strong><a href="https://pnp.github.io/script-samples/spo-download-all-doclibs/README.html?tabs=pnpps"><strong>download it here</strong>.</a></p>
  132.  
  133.  
  134.  
  135. <p>I tried to write it as well as I could, so I wrote it as a function inside of a module file. Because of that you have to save the script as a PSM1 file (as opposed to a regular old PS1 file). Then use <code>Import-Module </code>to import that PSM1 file, which adds my function, <code>Download-SharePointFiles</code> to your PowerShell host. Then run <code>Download-SharePointFiles</code> with the correct parameters. It looks like this:</p>
  136.  
  137.  
  138.  
  139. <figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="689" height="409" src="https://www.toddklindt.com/wp-content/uploads/2025/07/image.png" alt="" class="wp-image-16" srcset="https://www.toddklindt.com/wp-content/uploads/2025/07/image.png 689w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-300x178.png 300w" sizes="(max-width: 689px) 100vw, 689px" /></figure>
  140.  
  141.  
  142.  
  143. <p>That gives you output that looks like this:</p>
  144.  
  145.  
  146.  
  147. <figure class="wp-block-image size-full"><img decoding="async" width="1005" height="544" src="https://www.toddklindt.com/wp-content/uploads/2025/07/image-1.png" alt="" class="wp-image-17" srcset="https://www.toddklindt.com/wp-content/uploads/2025/07/image-1.png 1005w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-1-300x162.png 300w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-1-768x416.png 768w" sizes="(max-width: 1005px) 100vw, 1005px" /></figure>
  148.  
  149.  
  150.  
  151. <p>I hope you find it helpful. Let me know in the comments if there’s any functionality you’d like me to add.</p>
  152.  
  153.  
  154.  
  155. <p>tk</p>
  156.  
  157.  
  158.  
  159. <p>ShortURL:&nbsp;<a href="https://www.toddklindt.com/POSHDownloadAllFiles">https://www.toddklindt.com/POSHDownloadAllFiles</a></p>
  160. <p>The post <a href="https://www.toddklindt.com/2024/12/12/powershell-script-to-download-all-documents-from-all-doclibs-versions-included/">PowerShell Script to Download all Documents from all Doclibs, Versions Included</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  161. ]]></content:encoded>
  162. <wfw:commentRss>https://www.toddklindt.com/2024/12/12/powershell-script-to-download-all-documents-from-all-doclibs-versions-included/feed/</wfw:commentRss>
  163. <slash:comments>0</slash:comments>
  164. </item>
  165. <item>
  166. <title>Creating a PnP.PowerShell App Registration with PowerShell</title>
  167. <link>https://www.toddklindt.com/2024/08/22/creating-a-pnp-powershell-app-registration-with-powershell/</link>
  168. <comments>https://www.toddklindt.com/2024/08/22/creating-a-pnp-powershell-app-registration-with-powershell/#respond</comments>
  169. <dc:creator><![CDATA[Todd]]></dc:creator>
  170. <pubDate>Thu, 22 Aug 2024 19:02:00 +0000</pubDate>
  171. <category><![CDATA[Office 365]]></category>
  172. <category><![CDATA[PowerShell]]></category>
  173. <guid isPermaLink="false">https://www.toddklindt.com/?p=20</guid>
  174.  
  175. <description><![CDATA[<p>The PnP team recently announced they were&#160;making changes to how the PnP.PowerShell and M365 CLI authenticate. The short story is that if you want to use the PnP.PowerShell module or the M365 CLI after September 9th, 2024, you’ll need to create your own Application Registration, also known as an App Reg. I know, I know, [&#8230;]</p>
  176. <p>The post <a href="https://www.toddklindt.com/2024/08/22/creating-a-pnp-powershell-app-registration-with-powershell/">Creating a PnP.PowerShell App Registration with PowerShell</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  177. ]]></description>
  178. <content:encoded><![CDATA[
  179. <p>The PnP team recently announced they were&nbsp;<a href="https://pnp.github.io/blog/post/changes-pnp-management-shell-registration/">making changes to how the PnP.PowerShell and M365 CLI authenticate</a>. The short story is that if you want to use the PnP.PowerShell module or the M365 CLI after September 9th, 2024, you’ll need to create your own Application Registration, also known as an App Reg. I know, I know, that sounds confusing and scary. Fortunately there’s nothing to it. I’ve got all the steps for you to follow along. You’ll be ready to go in no time.</p>
  180.  
  181.  
  182.  
  183. <p>If you’re reading this, I assume you already have the&nbsp;<a href="https://pnp.github.io/powershell/articles/installation.html#installing-pnp-powershell">PnP.PowerShell module installed</a>. Good, because you’ll need that. The steps I’m going to show you will probably work with any version 2.0.0 or later, but I recommend updating to at least 2.9.0, which is the latest version as of this blog post. It’s got some extra sauce in it to make this go more smoothly.</p>
  184.  
  185.  
  186.  
  187. <p>After you’ve got the PnP.PowerShell module installed, open up PowerShell. This module has supported using custom app regs for a while, so all of the plumbing is already there. We need to run the&nbsp;Register-PnPAzureADApp&nbsp;cmdlet (also aliases as&nbsp;Register-EntraIDApp, they’re the same thing) to create our own App Reg. Example #1 from the help is what I use. Here’s what it looks like:</p>
  188.  
  189.  
  190.  
  191. <blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
  192. <p>Register-PnPAzureADApp -ApplicationName PnP.PowerShell -Tenant 1kgvf.onmicrosoft.com -Store CurrentUser –Interactive</p>
  193. </blockquote>
  194.  
  195.  
  196.  
  197. <p>The name of the App Reg we’re creating is “PnP.PowerShell.” My tenant is 1kgvf, but of course you’ll use your own. It’s going to create a certificate for us (we won’t need it) and store it in the CurrentUser Certificate Store. And finally, since I’m using MFA, like every good user does, I use the <code>–Interactive</code> switch to do browser based authentication. You’ll have to log in as a Global Admin, or a user the Global Admin has given permission to create App Regs to.</p>
  198.  
  199.  
  200.  
  201. <figure class="wp-block-image size-full"><img decoding="async" width="1024" height="410" src="https://www.toddklindt.com/wp-content/uploads/2025/07/image-2.png" alt="" class="wp-image-21" srcset="https://www.toddklindt.com/wp-content/uploads/2025/07/image-2.png 1024w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-2-300x120.png 300w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-2-768x308.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
  202.  
  203.  
  204.  
  205. <p><a href="https://www.toddklindt.com/blog/Lists/Posts/Attachments/904/image_2_7A03CC78.png"></a>After I log in Azure gets to work doing what it does. Since I didn’t pass any scopes to <code>Register-PnPAzureADApp</code> it uses its default set. You’ll get prompted to authenticate a second time then asked to consent to them.</p>
  206.  
  207.  
  208.  
  209. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="632" height="616" src="https://www.toddklindt.com/wp-content/uploads/2025/07/image-3.png" alt="" class="wp-image-22" srcset="https://www.toddklindt.com/wp-content/uploads/2025/07/image-3.png 632w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-3-300x292.png 300w" sizes="auto, (max-width: 632px) 100vw, 632px" /></figure>
  210.  
  211.  
  212.  
  213. <p>We’ll talk more about that in a bit.</p>
  214.  
  215.  
  216.  
  217. <p>Once it’s done, you’ll get a screen like this:</p>
  218.  
  219.  
  220.  
  221. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="677" height="306" src="https://www.toddklindt.com/wp-content/uploads/2025/07/image-4.png" alt="" class="wp-image-23" srcset="https://www.toddklindt.com/wp-content/uploads/2025/07/image-4.png 677w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-4-300x136.png 300w" sizes="auto, (max-width: 677px) 100vw, 677px" /></figure>
  222.  
  223.  
  224.  
  225. <p><a href="https://www.toddklindt.com/blog/Lists/Posts/Attachments/904/image_6_65124A05.png"></a>Here is where you’ll get the Client ID (also called AppID and AzureAppID, it’s all the same) you’ll need when you connect. In my example that’s <code>001ed5a0-be10-4bc3-a40c-a1cad0c987b7</code>. You can also get that ID number by going into the <a href="https://aad.portal.azure.com/">Azure Portal</a> and looking at the Enterprise applications.</p>
  226.  
  227.  
  228.  
  229. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="680" height="545" src="https://www.toddklindt.com/wp-content/uploads/2025/07/image-5.png" alt="" class="wp-image-24" srcset="https://www.toddklindt.com/wp-content/uploads/2025/07/image-5.png 680w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-5-300x240.png 300w" sizes="auto, (max-width: 680px) 100vw, 680px" /></figure>
  230.  
  231.  
  232.  
  233. <p><a href="https://www.toddklindt.com/blog/Lists/Posts/Attachments/904/image_8_65124A05.png"></a>Find your App Reg and click it.</p>
  234.  
  235.  
  236.  
  237. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="687" height="567" src="https://www.toddklindt.com/wp-content/uploads/2025/07/image-6.png" alt="" class="wp-image-25" srcset="https://www.toddklindt.com/wp-content/uploads/2025/07/image-6.png 687w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-6-300x248.png 300w" sizes="auto, (max-width: 687px) 100vw, 687px" /></figure>
  238.  
  239.  
  240.  
  241. <p><a href="https://www.toddklindt.com/blog/Lists/Posts/Attachments/904/image_10_65124A05.png"></a></p>
  242.  
  243.  
  244.  
  245. <p>Then you can copy it to your clipboard.</p>
  246.  
  247.  
  248.  
  249. <p>Now that you have your ClientID, let’s use that to connect to Microsoft 365. In my case I would use this connect statement:</p>
  250.  
  251.  
  252.  
  253. <blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
  254. <p>Connect-PnPOnline -Url&nbsp;<a href="https://1kgvf.sharepoint.com/">https://1kgvf.sharepoint.com/</a>&nbsp;-Interactive -ClientId 001ed5a0-be10-4bc3-a40c-a1cad0c987b7</p>
  255. </blockquote>
  256.  
  257.  
  258.  
  259. <p>Of course you’ll use your own tenant name and the ClientID that you created. The one I created isn’t visible to your tenant.</p>
  260.  
  261.  
  262.  
  263. <p>You’ll get prompted for a username and password, and hopefully some MFA. Then you’ll be connected to M365. Here’s how it all looks:</p>
  264.  
  265.  
  266.  
  267. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="701" height="615" src="https://www.toddklindt.com/wp-content/uploads/2025/07/image-7.png" alt="" class="wp-image-26" srcset="https://www.toddklindt.com/wp-content/uploads/2025/07/image-7.png 701w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-7-300x263.png 300w" sizes="auto, (max-width: 701px) 100vw, 701px" /></figure>
  268.  
  269.  
  270.  
  271. <p><a href="https://www.toddklindt.com/blog/Lists/Posts/Attachments/904/image_12_65124A05.png"></a>As you can see, I’m connected and a quick function check looks like everything is working fine. Success!!! Well, sort of…</p>
  272.  
  273.  
  274.  
  275. <p>We talked before about scopes, and how the <code>Register-AzureADApp</code> cmdlet used its default scopes since I didn’t specify any. Those scopes covered SharePoint, and Users, but not much else. For instance, if I try to get a list of the Teams in my tenant, I’m met with an authentication screen. After I authenticate (with a Global Admin) I get a page wanting more permission:</p>
  276.  
  277.  
  278.  
  279. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="568" height="411" src="https://www.toddklindt.com/wp-content/uploads/2025/07/image-8.png" alt="" class="wp-image-27" srcset="https://www.toddklindt.com/wp-content/uploads/2025/07/image-8.png 568w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-8-300x217.png 300w" sizes="auto, (max-width: 568px) 100vw, 568px" /></figure>
  280.  
  281.  
  282.  
  283. <p><a href="https://www.toddklindt.com/blog/Lists/Posts/Attachments/904/image_14_65124A05.png"></a>Now it wants access to Read all groups, and more User permissions. I clicked Consent and then Accept. It returned my Teams to me.<a href="https://www.toddklindt.com/blog/Lists/Posts/Attachments/904/image_16_65124A05.png"></a></p>
  284.  
  285.  
  286.  
  287. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="567" height="142" src="https://www.toddklindt.com/wp-content/uploads/2025/07/image-9.png" alt="" class="wp-image-28" srcset="https://www.toddklindt.com/wp-content/uploads/2025/07/image-9.png 567w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-9-300x75.png 300w" sizes="auto, (max-width: 567px) 100vw, 567px" /></figure>
  288.  
  289.  
  290.  
  291. <p>This adds some complication. If the user you normally use PnP.PowerShell with is a GA, then you’re golden. Every time you stumble onto something you can’t do, it’ll prompt you and you’ll consent. If you have a separate GA user, or someone else is doing the GA stuff for you, you’ll have to go into the Azure Portal and add the additional Scopes in there. That sounds like something that would fit really well in another blog post. <img decoding="async" src="https://www.toddklindt.com/blog/Lists/Posts/Attachments/904/wlEmoticon-smile_2_65124A05.png" alt="Smile"></p>
  292.  
  293.  
  294.  
  295. <p>There’s another gotcha. By default, when <code>Register-PnPAzureADApp</code> creates the App Reg, it only gives the user that created it permission to use it. If anyone else needs to use it you’ll need to go into the Azure Portal, open the App Reg, go to the Users and Groups blade, and add the additional users. That won’t give them any additional permissions anywhere in M365, it simply gives them permission to use this App Reg when using PnP.PowerShell.</p>
  296.  
  297.  
  298.  
  299. <p>I mentioned at the top that version 2.9.0 had some extra sauce to help with this. It can get a bit tedious adding the <code>–ClientID SomeUglyGUID </code>part every time you connect. This is particularly painful if you’ve got scripts and the like with connect statements that don’t have the <code>-ClientID </code>parameter. In 2.9.0 and later <code>Connect-PnPOnline</code> supports an environment variable <code>ENTRAID_APP_ID</code>. If no <code>–ClientID</code> is specified, and that variable has a value, <code>Connect-PnPOnline</code> will use that. Here’s what it looks like:</p>
  300.  
  301.  
  302.  
  303. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="596" height="268" src="https://www.toddklindt.com/wp-content/uploads/2025/07/image-10.png" alt="" class="wp-image-29" srcset="https://www.toddklindt.com/wp-content/uploads/2025/07/image-10.png 596w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-10-300x135.png 300w" sizes="auto, (max-width: 596px) 100vw, 596px" /></figure>
  304.  
  305.  
  306.  
  307. <p><a href="https://www.toddklindt.com/blog/Lists/Posts/Attachments/904/image_18_65124A05.png"></a>That variable value will go away when you close PowerShell. If you put the <code>$env:ENTRAID_APP_ID = "001ed5a0-be10-4bc3-a40c-a1cad0c987b7"</code> line in <a href="https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.4">your PowerShell profile</a> it will get populated every time you open PowerShell. If you’re a local admin on your machine you can also set a persistent environment variable in an admin prompt with this line:</p>
  308.  
  309.  
  310.  
  311. <blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
  312. <p>[System.Environment]::SetEnvironmentVariable(&#8216;ENTRAID_APP_ID&#8217;, &#8216;001ed5a0-be10-4bc3-a40c-a1cad0c987b7&#8217;, &#8216;User&#8217;)</p>
  313. </blockquote>
  314.  
  315.  
  316.  
  317. <p>Or you can set it in the Control Panel. Again, you’ll want to use your Client ID, not mine.</p>
  318.  
  319.  
  320.  
  321. <p>I hope that helps. If you have any questions, leave me a comment.</p>
  322.  
  323.  
  324.  
  325. <p>tk</p>
  326.  
  327.  
  328.  
  329. <p>ShortURL:&nbsp;<a href="https://www.toddklindt.com/PoshMakeAppReg">https://www.toddklindt.com/PoshMakeAppReg</a></p>
  330. <p>The post <a href="https://www.toddklindt.com/2024/08/22/creating-a-pnp-powershell-app-registration-with-powershell/">Creating a PnP.PowerShell App Registration with PowerShell</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  331. ]]></content:encoded>
  332. <wfw:commentRss>https://www.toddklindt.com/2024/08/22/creating-a-pnp-powershell-app-registration-with-powershell/feed/</wfw:commentRss>
  333. <slash:comments>0</slash:comments>
  334. </item>
  335. <item>
  336. <title>Happy Monday!</title>
  337. <link>https://www.toddklindt.com/2024/07/29/happy-monday/</link>
  338. <comments>https://www.toddklindt.com/2024/07/29/happy-monday/#respond</comments>
  339. <dc:creator><![CDATA[Todd]]></dc:creator>
  340. <pubDate>Mon, 29 Jul 2024 20:32:00 +0000</pubDate>
  341. <category><![CDATA[Uncategorized]]></category>
  342. <guid isPermaLink="false">https://www.toddklindt.com/?p=33</guid>
  343.  
  344. <description><![CDATA[<p>I know Mondays can be rough. Fortunately I have something to help you through this particular Monday. I was recently interviewed on the “Mastering Mondays” podcast from the&#160;No More Bad Mondays&#160;guys. I had a blast&#160;catching up with Dave and Matt. We talk about our favorite tech and I recount an experience in my childhood that [&#8230;]</p>
  345. <p>The post <a href="https://www.toddklindt.com/2024/07/29/happy-monday/">Happy Monday!</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  346. ]]></description>
  347. <content:encoded><![CDATA[
  348. <p>I know Mondays can be rough. Fortunately I have something to help you through this particular Monday. I was recently interviewed on the “<a href="https://linktr.ee/masteringmondays">Mastering Mondays</a>” podcast from the&nbsp;<a href="https://www.nomorebadmondays.com/">No More Bad Mondays</a>&nbsp;guys. I had a blast&nbsp;catching up with Dave and Matt. We talk about our favorite tech and I recount an experience in my childhood that nearly scarred me for life. The time flew by. Give the episode a listen on your favorite platform and let me know what you think.</p>
  349.  
  350.  
  351.  
  352. <p>tk</p>
  353.  
  354.  
  355.  
  356. <p>ShortURL:&nbsp;<a href="https://www.toddklindt.com/HappyMonday">https://www.toddklindt.com/HappyMonday</a></p>
  357. <p>The post <a href="https://www.toddklindt.com/2024/07/29/happy-monday/">Happy Monday!</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  358. ]]></content:encoded>
  359. <wfw:commentRss>https://www.toddklindt.com/2024/07/29/happy-monday/feed/</wfw:commentRss>
  360. <slash:comments>0</slash:comments>
  361. </item>
  362. <item>
  363. <title>Syskit Blog Post on AI and PowerShell</title>
  364. <link>https://www.toddklindt.com/2024/07/08/syskit-blog-post-on-ai-and-powershell/</link>
  365. <comments>https://www.toddklindt.com/2024/07/08/syskit-blog-post-on-ai-and-powershell/#respond</comments>
  366. <dc:creator><![CDATA[Todd]]></dc:creator>
  367. <pubDate>Mon, 08 Jul 2024 20:36:00 +0000</pubDate>
  368. <category><![CDATA[PowerShell]]></category>
  369. <guid isPermaLink="false">https://www.toddklindt.com/?p=35</guid>
  370.  
  371. <description><![CDATA[<p>My buddies at Syskit and I were chatting recently and we realized we hadn’t worked together in far, far too long. We decided that needed to be remedied right away! So last week I wrote a blog post for them called&#160;Using AI to write PowerShell scripts. It’s even more fun than it sounds, I promise. [&#8230;]</p>
  372. <p>The post <a href="https://www.toddklindt.com/2024/07/08/syskit-blog-post-on-ai-and-powershell/">Syskit Blog Post on AI and PowerShell</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  373. ]]></description>
  374. <content:encoded><![CDATA[
  375. <p>My buddies at Syskit and I were chatting recently and we realized we hadn’t worked together in far, far too long. We decided that needed to be remedied right away! So last week I wrote a blog post for them called&nbsp;<a href="https://www.syskit.com/blog/using-ai-to-write-powershell-scripts/">Using AI to write PowerShell scripts</a>. It’s even more fun than it sounds, I promise. In it I cover my process for using AI to write even cooler PowerShell scripts than I would be able to on my own. You can even use the free version of ChatGPT to write better PowerShell.&nbsp;</p>
  376.  
  377.  
  378.  
  379. <p>Give it a read and let us know what you think.</p>
  380.  
  381.  
  382.  
  383. <p>tk</p>
  384.  
  385.  
  386.  
  387. <p>Short URL:&nbsp;<a href="https://www.toddklindt.com/SyskitAIandPowerShell">https://www.toddklindt.com/SyskitAIandPowerShell</a></p>
  388. <p>The post <a href="https://www.toddklindt.com/2024/07/08/syskit-blog-post-on-ai-and-powershell/">Syskit Blog Post on AI and PowerShell</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  389. ]]></content:encoded>
  390. <wfw:commentRss>https://www.toddklindt.com/2024/07/08/syskit-blog-post-on-ai-and-powershell/feed/</wfw:commentRss>
  391. <slash:comments>0</slash:comments>
  392. </item>
  393. <item>
  394. <title>How to use PowerShell 7 and PnP.PowerShell When You Can’t Install Software</title>
  395. <link>https://www.toddklindt.com/2024/06/04/how-to-use-powershell-7-and-pnp-powershell-when-you-cant-install-software/</link>
  396. <comments>https://www.toddklindt.com/2024/06/04/how-to-use-powershell-7-and-pnp-powershell-when-you-cant-install-software/#respond</comments>
  397. <dc:creator><![CDATA[Todd]]></dc:creator>
  398. <pubDate>Tue, 04 Jun 2024 20:45:00 +0000</pubDate>
  399. <category><![CDATA[Uncategorized]]></category>
  400. <guid isPermaLink="false">https://www.toddklindt.com/?p=37</guid>
  401.  
  402. <description><![CDATA[<p>During the last&#160;Ask Sympraxis&#160;our friend&#160;Kasper Larsen&#160;relayed a question he had gotten recently, “Is it possible to run the PnP.PowerShell module if I’m not allowed to install it or PowerShell 7?” The question brought tears of sadness to my eyes. Then, my indomitable spirit kicked in, “We’ll help this person!”, it said. And here we are. [&#8230;]</p>
  403. <p>The post <a href="https://www.toddklindt.com/2024/06/04/how-to-use-powershell-7-and-pnp-powershell-when-you-cant-install-software/">How to use PowerShell 7 and PnP.PowerShell When You Can’t Install Software</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  404. ]]></description>
  405. <content:encoded><![CDATA[
  406. <p>During the last&nbsp;<a href="https://www.sympraxisconsulting.com/asksympraxis/">Ask Sympraxis</a>&nbsp;our friend&nbsp;<a href="https://mvp.microsoft.com/en-US/MVP/profile/8b84e3ee-ffd1-4222-998e-af31f40925e8">Kasper Larsen</a>&nbsp;relayed a question he had gotten recently, “Is it possible to run the PnP.PowerShell module if I’m not allowed to install it or PowerShell 7?” The question brought tears of sadness to my eyes. Then, my indomitable spirit kicked in, “We’ll help this person!”, it said. And here we are.</p>
  407.  
  408.  
  409.  
  410. <p>The short answer to, “Can you run PnP.PowerShell if you can’t install anything” is a resounding, “Yes! Heck yes you can!” The answer to “how” comes in two parts. The first is to download <a href="https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.4#installing-the-zip-package">the PowerShell 7 Zip file</a> and run<code> pwsh.exe</code> out of there without installing it. The second part is to <a href="https://pnp.github.io/powershell/articles/installation.html">install the PnP.PowerShell module</a> in the CurrentUser scope, so that it doesn’t try to write anything to a protected directory. After that, run PnP.PowerShell cmdlets to your heart’s content.</p>
  411.  
  412.  
  413.  
  414. <p>Here’s what it looks like:</p>
  415.  
  416.  
  417.  
  418. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="684" height="185" src="https://www.toddklindt.com/wp-content/uploads/2025/07/image-11.png" alt="" class="wp-image-38" srcset="https://www.toddklindt.com/wp-content/uploads/2025/07/image-11.png 684w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-11-300x81.png 300w" sizes="auto, (max-width: 684px) 100vw, 684px" /></figure>
  419.  
  420.  
  421.  
  422. <p>There’s proof, the PowerShell way, that the user I’m logged in as isn’t an admin. First, I download the&nbsp;<a href="https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.4#installing-the-zip-package">PowerShell 7 zip file&nbsp;</a>and extract it to a folder in my Downloads folder.</p>
  423.  
  424.  
  425.  
  426. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="689" height="195" src="https://www.toddklindt.com/wp-content/uploads/2025/07/image-12.png" alt="" class="wp-image-39" srcset="https://www.toddklindt.com/wp-content/uploads/2025/07/image-12.png 689w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-12-300x85.png 300w" sizes="auto, (max-width: 689px) 100vw, 689px" /></figure>
  427.  
  428.  
  429.  
  430. <p>Then I&nbsp;CD&nbsp;to the directory and run&nbsp;pwsh.exe, like this:</p>
  431.  
  432.  
  433.  
  434. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="697" height="238" src="https://www.toddklindt.com/wp-content/uploads/2025/07/image-13.png" alt="" class="wp-image-40" srcset="https://www.toddklindt.com/wp-content/uploads/2025/07/image-13.png 697w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-13-300x102.png 300w" sizes="auto, (max-width: 697px) 100vw, 697px" /></figure>
  435.  
  436.  
  437.  
  438. <p>You can see from the <code>$PSVersionTable</code> that we’re running PowerShell 7. Now I install the PnP.PowerShell module to my user with the line <code>Install-Module pnp.powershell –Scope CurrentUser</code>.</p>
  439.  
  440.  
  441.  
  442. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="697" height="278" src="https://www.toddklindt.com/wp-content/uploads/2025/07/image-14.png" alt="" class="wp-image-41" srcset="https://www.toddklindt.com/wp-content/uploads/2025/07/image-14.png 697w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-14-300x120.png 300w" sizes="auto, (max-width: 697px) 100vw, 697px" /></figure>
  443.  
  444.  
  445.  
  446. <p>After I run the install I use <code>Connect-PnPOnline</code> like I normally would. At the bottom I highlighted where the module is installed, your personal Documents directory.</p>
  447.  
  448.  
  449.  
  450. <p>One very important note, is that you (or anyone) won’t be able to connect if the PnP.PowerShell application registration hasn’t been approved in your tenant. This blog post, “<a href="https://www.toddklindt.com/blog/Lists/Posts/Post.aspx?ID=886">How to Register the PnP.PowerShell App Registration if You’re not a Tenant Admin</a>” covers it a bit. That App Registration is necessary in 99% of the use cases. You can connect and do a few SharePoint things without it, but that list is pretty short.</p>
  451.  
  452.  
  453.  
  454. <p>I’m not sure how often this will come up, but hopefully this blog post is at least interesting. </p>
  455.  
  456.  
  457.  
  458. <p>tk</p>
  459.  
  460.  
  461.  
  462. <p>ShortURL:&nbsp;<a href="https://www.toddklindt.com/PoshWithoutAdmin">https://www.toddklindt.com/PoshWithoutAdmin</a></p>
  463. <p>The post <a href="https://www.toddklindt.com/2024/06/04/how-to-use-powershell-7-and-pnp-powershell-when-you-cant-install-software/">How to use PowerShell 7 and PnP.PowerShell When You Can’t Install Software</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  464. ]]></content:encoded>
  465. <wfw:commentRss>https://www.toddklindt.com/2024/06/04/how-to-use-powershell-7-and-pnp-powershell-when-you-cant-install-software/feed/</wfw:commentRss>
  466. <slash:comments>0</slash:comments>
  467. </item>
  468. <item>
  469. <title>Simplifying Client Credentials with PowerShell: Add-ClientCredential</title>
  470. <link>https://www.toddklindt.com/2023/09/27/simplifying-client-credentials-with-powershell-add-clientcredential/</link>
  471. <comments>https://www.toddklindt.com/2023/09/27/simplifying-client-credentials-with-powershell-add-clientcredential/#respond</comments>
  472. <dc:creator><![CDATA[Todd]]></dc:creator>
  473. <pubDate>Wed, 27 Sep 2023 21:06:00 +0000</pubDate>
  474. <category><![CDATA[Office 365]]></category>
  475. <category><![CDATA[PowerShell]]></category>
  476. <guid isPermaLink="false">https://www.toddklindt.com/?p=43</guid>
  477.  
  478. <description><![CDATA[<p>If you’ve been around the block with SharePoint or Microsoft 365 administration, you know that handling client credentials can sometimes feel like juggling with fire. When I start a new engagement with a client I generally get credentials to access their tenant. Of course they immediately go into our password management tool. I also do [&#8230;]</p>
  479. <p>The post <a href="https://www.toddklindt.com/2023/09/27/simplifying-client-credentials-with-powershell-add-clientcredential/">Simplifying Client Credentials with PowerShell: Add-ClientCredential</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  480. ]]></description>
  481. <content:encoded><![CDATA[
  482. <p>If you’ve been around the block with SharePoint or Microsoft 365 administration, you know that handling client credentials can sometimes feel like juggling with fire. When I start a new engagement with a client I generally get credentials to access their tenant. Of course they immediately go into our password management tool. I also do a lot of PowerShell scripting for my clients, so I save them to the Windows Credential store too, so that I can connect with&nbsp;Connect-PnPOnline&nbsp;without having to enter them each time. And while that’s not a lot of work, I thought I could streamline it.&nbsp;That’s why I’ve put together a PowerShell command,&nbsp;Add-ClientCredential, that makes it a little easier.</p>
  483.  
  484.  
  485.  
  486. <h1 class="wp-block-heading">What Does&nbsp;Add-ClientCredential&nbsp;do?</h1>
  487.  
  488.  
  489.  
  490. <p>In a nutshell, this PowerShell command is designed to streamline the process of adding client credentials in a SharePoint or Microsoft 365 environment. It stores your credential for&nbsp;<a href="https://tenant.sharepoint.com/">https://tenant.sharepoint.com</a>&nbsp;and&nbsp;<a href="https://tenant-admin.sharepoint.com/">https://tenant-admin.sharepoint.com</a>. If you don’t specify any credentials when you connect with&nbsp;Connect-PnPOnline&nbsp;it will look for them in the Windows Credential Store. If you have one assigned for the root of the tenant,&nbsp;<a href="https://tenant.sharepoint.com/">https://tenant.sharepoint.com</a>, it will also use that for other sites in the tenant, like&nbsp;<a href="https://tenant.sharepoint.com/sites/ToddisTheBest">https://tenant.sharepoint.com/sites/ToddisTheBest</a>, if a credential is not saved for that specific site.</p>
  491.  
  492.  
  493.  
  494. <p>Here’s a quick example:</p>
  495.  
  496.  
  497.  
  498. <blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
  499. <p><code>Add-ClientCredential -TenantName "contoso" -UserName <a href="mailto:admin@contoso.com">admin@contoso.com</a></code></p>
  500. </blockquote>
  501.  
  502.  
  503.  
  504. <p>I like this method because then my password will never show up in History or a Transcript if one is running.&nbsp;Since we didn’t pass it a password, it will prompt you for one.&nbsp;Then it will create credential entries for&nbsp;<a href="https://contoso.sharepoint.com/">https://contoso.sharepoint.com</a>,&nbsp;<a href="http://contoso.sharepoint.com/">http://contoso.sharepoint.com</a>, and&nbsp;<a href="https://contoso-admin.sharepoint.com/">https://contoso-admin.sharepoint.com</a></p>
  505.  
  506.  
  507.  
  508. <p>To pass it a password, do it like this:</p>
  509.  
  510.  
  511.  
  512. <blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
  513. <p><code>Add-ClientCredential -TenantName "contoso" -UserName <a href="mailto:admin@contoso.com">admin@contoso.com</a> -Password (ConvertTo-SecureString "YourPassword”<br>-AsPlainText -Force)</code></p>
  514. </blockquote>
  515.  
  516.  
  517.  
  518. <p>Keep in mind that will show up in plain text in PowerShell’s&nbsp;Get-History, or the Transcript file, if you have that running.</p>
  519.  
  520.  
  521.  
  522. <p>I built in some smarts so that if there is already a credential stored for “Contoso” it will let you know and ask you if you want to overwrite it.</p>
  523.  
  524.  
  525.  
  526. <p>If you want to get super fancy you can add the –TestCredential switch which will test the credentials you gave it by logging in with them. All of this is available if you run help <code>Add-ClientCredential –Examples.</code></p>
  527.  
  528.  
  529.  
  530. <p>In the background this function uses<code> <a href="https://pnp.github.io/powershell/cmdlets/Add-PnPStoredCredential.html">Add-PnPStoredCredential</a></code> to store the credentials for you. It adds them for the root of the tenant, and the –admin URL.</p>
  531.  
  532.  
  533.  
  534. <h1 class="wp-block-heading">How to Get Started</h1>
  535.  
  536.  
  537.  
  538. <p>To get your hands on this little beauty, head over to <a href="https://github.com/ToddKlindt/PowerShell">my GitHub repository</a>. You can download <a href="https://github.com/ToddKlindt/PowerShell/blob/master/addclientcreds.psm1">addclientcreds.psm1</a> itself, or clone the whole repo. Use<code> Import-Module</code> to import it into your PowerShell host and you’re ready to go.</p>
  539.  
  540.  
  541.  
  542. <h1 class="wp-block-heading">Wrapping Up</h1>
  543.  
  544.  
  545.  
  546. <p><code>addclientcreds.psm1</code> is my attempt to put a little more simplicity and sanity into the world of SharePoint and Microsoft 365 administration. I hope you find it as useful as I do. As always, I welcome your feedback and questions. Drop a comment below or shoot me a message on Twitter <a href="https://twitter.com/ToddKlindt">@ToddKlindt</a>.</p>
  547.  
  548.  
  549.  
  550. <p>tk</p>
  551.  
  552.  
  553.  
  554. <p>ShortURL:&nbsp;<a href="https://www.toddklindt.com/PoshAddClientCreds">https://www.toddklindt.com/PoshAddClientCreds</a></p>
  555.  
  556.  
  557.  
  558. <p></p>
  559. <p>The post <a href="https://www.toddklindt.com/2023/09/27/simplifying-client-credentials-with-powershell-add-clientcredential/">Simplifying Client Credentials with PowerShell: Add-ClientCredential</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  560. ]]></content:encoded>
  561. <wfw:commentRss>https://www.toddklindt.com/2023/09/27/simplifying-client-credentials-with-powershell-add-clientcredential/feed/</wfw:commentRss>
  562. <slash:comments>0</slash:comments>
  563. </item>
  564. <item>
  565. <title>Supercharging PowerShell with a Little Help from AI</title>
  566. <link>https://www.toddklindt.com/2023/07/26/supercharging-powershell-with-a-little-help-from-ai/</link>
  567. <comments>https://www.toddklindt.com/2023/07/26/supercharging-powershell-with-a-little-help-from-ai/#respond</comments>
  568. <dc:creator><![CDATA[Todd]]></dc:creator>
  569. <pubDate>Wed, 26 Jul 2023 22:20:00 +0000</pubDate>
  570. <category><![CDATA[Uncategorized]]></category>
  571. <guid isPermaLink="false">https://www.toddklindt.com/?p=55</guid>
  572.  
  573. <description><![CDATA[<p>I know I have a checkered past with the Developer community. Back in the old days they could do some pretty awful things to my beloved on-prem SharePoint servers with their incessant BINing and GACing things. Fortunately for all of us (including those defenseless servers) those days are behind us. So, I just got off&#160;this [&#8230;]</p>
  574. <p>The post <a href="https://www.toddklindt.com/2023/07/26/supercharging-powershell-with-a-little-help-from-ai/">Supercharging PowerShell with a Little Help from AI</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  575. ]]></description>
  576. <content:encoded><![CDATA[
  577. <p>I know I have a checkered past with the Developer community. Back in the old days they could do some pretty awful things to my beloved on-prem SharePoint servers with their incessant BINing and GACing things. Fortunately for all of us (including those defenseless servers) those days are behind us.</p>
  578.  
  579.  
  580.  
  581. <p>So, I just got off&nbsp;<a href="https://www.youtube.com/watch?v=STvHHHfie7k&amp;t=2640s">this Microsoft 365 &amp; Power Platform Development Community call</a>, and boy, do I have some cool stuff to share with you. I got the chance to show off this neat trick I&#8217;ve been working on &#8211; using&nbsp;<a href="https://docs.github.com/en/copilot/quickstart">GitHub Copilot</a>&nbsp;and&nbsp;<a href="https://chat.openai.com/">ChatGPT</a>&nbsp;(or any AI you&#8217;re into) to give your PowerShell scripting a serious boost.</p>
  582.  
  583.  
  584.  
  585. <p>You&#8217;re probably thinking, &#8220;AI and PowerShell, really?&#8221; But stick with me here. It&#8217;s like having a co-pilot for your coding. Like someone smarter than you, looking over your shoulder, and there if you have questions. It&#8217;s there to help you out, make things smoother, and let&#8217;s be honest, who doesn&#8217;t want to feel a bit like Tony Stark talking to JARVIS while coding?</p>
  586.  
  587.  
  588.  
  589. <p>During the demo, I took everyone on a little tour of how you can get GitHub and Copilot and ChatGPT into the mix with your PowerShell development routine. It&#8217;s all about using AI to help with the heavy lifting &#8211; coding, debugging, repetitive tasks, and even the dreaded documentation. I&#8217;m telling you, this is next-level stuff, and we&#8217;re just scratching the surface of what AI can do for us.</p>
  590.  
  591.  
  592.  
  593. <p>But hey, don&#8217;t just take my word for it. Give it a whirl! Play around with adding some AI into your PowerShell development and see how it goes. I used ChatGPT and GitHub Copilot for the demo, but you can pick any AI you&#8217;re comfortable with.</p>
  594.  
  595.  
  596.  
  597. <p>That&#8217;s it from me for now. Keep an eye out for more cool AI posts.</p>
  598.  
  599.  
  600.  
  601. <p><a href="https://pnp.github.io/#community">Microsoft 365 &amp; Power Platform Development Community call</a></p>
  602.  
  603.  
  604.  
  605. <p><a href="https://www.youtube.com/watch?v=STvHHHfie7k&amp;t=2649s">My AI Demo</a></p>
  606.  
  607.  
  608.  
  609. <p>tk</p>
  610.  
  611.  
  612.  
  613. <p>ShortURL:&nbsp;<a href="http://web02:17660/PoshwithAI">https://www.toddklindt.com/PoshwithAI</a></p>
  614. <p>The post <a href="https://www.toddklindt.com/2023/07/26/supercharging-powershell-with-a-little-help-from-ai/">Supercharging PowerShell with a Little Help from AI</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  615. ]]></content:encoded>
  616. <wfw:commentRss>https://www.toddklindt.com/2023/07/26/supercharging-powershell-with-a-little-help-from-ai/feed/</wfw:commentRss>
  617. <slash:comments>0</slash:comments>
  618. </item>
  619. <item>
  620. <title>Automating Attorney Files and Case Folders Creation in SharePoint</title>
  621. <link>https://www.toddklindt.com/2023/07/13/automating-attorney-files-and-case-folders-creation-in-sharepoint/</link>
  622. <comments>https://www.toddklindt.com/2023/07/13/automating-attorney-files-and-case-folders-creation-in-sharepoint/#respond</comments>
  623. <dc:creator><![CDATA[Todd]]></dc:creator>
  624. <pubDate>Thu, 13 Jul 2023 22:13:00 +0000</pubDate>
  625. <category><![CDATA[Uncategorized]]></category>
  626. <guid isPermaLink="false">https://www.toddklindt.com/?p=45</guid>
  627.  
  628. <description><![CDATA[<p>In my last masterpiece, Tackling SharePoint&#8217;s 5000 Item Limit with PowerShell and Search, I show how to use PowerShell with Search to return more than 5000 items from a SharePoint list or library, even if SharePoint refuses to return more than 5000 items. Pretty impressive, right? When demonstrating something like that you need a list or [&#8230;]</p>
  629. <p>The post <a href="https://www.toddklindt.com/2023/07/13/automating-attorney-files-and-case-folders-creation-in-sharepoint/">Automating Attorney Files and Case Folders Creation in SharePoint</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  630. ]]></description>
  631. <content:encoded><![CDATA[
  632. <p>In my last masterpiece, <a href="https://www.toddklindt.com/2023/07/10/tackling-sharepoints-5000-item-limit-with-powershell-and-search/">Tackling SharePoint&#8217;s 5000 Item Limit with PowerShell and Search</a>, I show how to use PowerShell with Search to return more than 5000 items from a SharePoint list or library, even if SharePoint refuses to return more than 5000 items. Pretty impressive, right? When demonstrating something like that you need a list or library with more than 5000 items. There are are a lot of scripts out there that can create test data, but I needed something specific. So, I opened up a new windows in VS Code and got to coding.</p>
  633.  
  634.  
  635.  
  636. <p>The PowerShell function I wrote is&nbsp;<a href="https://github.com/ToddKlindt/PowerShell/blob/master/Search%20demonstration%20creation%20Module.psm1">Add-AttorneyFiles</a><strong>,</strong>&nbsp;which is designed to streamline the creation of attorney files and case folders. Lots and lots of them.</p>
  637.  
  638.  
  639.  
  640. <p>This function has a few parameters to tailor the files and folders it creates. It accepts two mandatory parameters,&nbsp;<strong>AttorneyCount</strong>&nbsp;and&nbsp;<strong>CaseCount</strong>, specifying the number of attorneys and case folders to create for each attorney.</p>
  641.  
  642.  
  643.  
  644. <p>There are also a few switch parameters that allow you to customize the function&#8217;s behavior further. You can choose to create a file in each case folder using the&nbsp;<strong>CreateStaticFile</strong>&nbsp;switch, or specify that only closed or client case folders should be created with the&nbsp;<strong>OnlyClosedCases</strong>&nbsp;and&nbsp;<strong>OnlyClientCases</strong>&nbsp;switches.</p>
  645.  
  646.  
  647.  
  648. <p>You can also specify the name of the static file created using the&nbsp;<strong>StaticFileName</strong>&nbsp;parameter. If no name is provided, the function will default to creating a file named &#8220;<strong>readme.txt</strong>&#8220;.</p>
  649.  
  650.  
  651.  
  652. <p>The function starts by checking if a connection to a SharePoint site exists. If it does, the function creates attorney files and case folders in a SharePoint directory. The names for these attorney files are generated randomly from a list of common first and last names. This randomness helps to create a more realistic environment for testing.</p>
  653.  
  654.  
  655.  
  656. <p>Once the list of attorney names is created, the function will loop through each attorney, creating the appropriate case folders, either client case folders, closed case folders, or both, based on the parameters passed in.</p>
  657.  
  658.  
  659.  
  660. <p>The function gives the folders and files it creates a randomly generated last and first name, along with a random case number, for a more realistic setup.</p>
  661.  
  662.  
  663.  
  664. <p>If the&nbsp;<strong>CreateStaticFile</strong>&nbsp;switch is present, a static file will be created in each case folder. The content of these static files is a random selection of words, downloaded from a free online dictionary. This randomization also contributes to a more realistic testing environment.</p>
  665.  
  666.  
  667.  
  668. <p>Here&#8217;s an example of how you might use this function:</p>
  669.  
  670.  
  671.  
  672. <p><br><strong>Add-AttorneyFiles -AttorneyCount 10 -CaseCount 5 –CreateStaticFile</strong></p>
  673.  
  674.  
  675.  
  676. <figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="664" height="626" src="https://www.toddklindt.com/wp-content/uploads/2025/07/image-15.png" alt="" class="wp-image-46" srcset="https://www.toddklindt.com/wp-content/uploads/2025/07/image-15.png 664w, https://www.toddklindt.com/wp-content/uploads/2025/07/image-15-300x283.png 300w" sizes="auto, (max-width: 664px) 100vw, 664px" /></figure>
  677.  
  678.  
  679.  
  680. <p><a href="http://web02:17660/blog/Lists/Posts/Attachments/899/image_2_779AC853.png"></a></p>
  681.  
  682.  
  683.  
  684. <p>This will create 10 attorney folders, each with 5 case folders. A static file named &#8220;<strong>readme.txt</strong>&#8221; will be created in each case folder. For my blog a created a whole lot of&nbsp;<strong>autorun.inf</strong>&nbsp;files.</p>
  685.  
  686.  
  687.  
  688. <p>By automating the setup of this testing environment, I was able to generate a high volume of test data, with a format that accurately represented my client’s data, without exposing any of it.</p>
  689.  
  690.  
  691.  
  692. <p>I’ve uploaded the&nbsp;<a href="https://github.com/ToddKlindt/PowerShell/blob/master/Search%20demonstration%20creation%20Module.psm1">code to GitHub</a>. Check it out.</p>
  693.  
  694.  
  695.  
  696. <p>Happy PowerShelling, and as always, feel free to drop any questions or comments below!</p>
  697.  
  698.  
  699.  
  700. <p>tk</p>
  701.  
  702.  
  703.  
  704. <p>ShortURL:&nbsp;<a href="http://web02:17660/PoshAttorneyFiles">https://www.toddklindt.com/PoshAttorneyFiles</a></p>
  705. <p>The post <a href="https://www.toddklindt.com/2023/07/13/automating-attorney-files-and-case-folders-creation-in-sharepoint/">Automating Attorney Files and Case Folders Creation in SharePoint</a> appeared first on <a href="https://www.toddklindt.com">Todd Klindt&#039;s Blog</a>.</p>
  706. ]]></content:encoded>
  707. <wfw:commentRss>https://www.toddklindt.com/2023/07/13/automating-attorney-files-and-case-folders-creation-in-sharepoint/feed/</wfw:commentRss>
  708. <slash:comments>0</slash:comments>
  709. </item>
  710. </channel>
  711. </rss>
  712.  

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=https%3A//www.toddklindt.com/feed/

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda