<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
><channel><title>Remko Weijnen&#039;s Blog (Remko&#039;s Blog) &#187; PowerShell</title> <atom:link href="http://www.remkoweijnen.nl/blog/topics/powershell/feed/" rel="self" type="application/rss+xml" /><link>http://www.remkoweijnen.nl/blog</link> <description>About Terminal Server, Citrix, Delphi and other stuff</description> <lastBuildDate>Tue, 31 Jan 2012 15:37:53 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.2.1</generator> <item><title>Take ownership of a registry key in PowerShell</title><link>http://www.remkoweijnen.nl/blog/2012/01/16/take-ownership-of-a-registry-key-in-powershell/</link> <comments>http://www.remkoweijnen.nl/blog/2012/01/16/take-ownership-of-a-registry-key-in-powershell/#comments</comments> <pubDate>Mon, 16 Jan 2012 15:39:36 +0000</pubDate> <dc:creator>Remko</dc:creator> <category><![CDATA[PowerShell]]></category><guid isPermaLink="false">http://www.remkoweijnen.nl/blog/2012/01/16/take-ownership-of-a-registry-key-in-powershell/</guid> <description><![CDATA[After reading Andy Morgan&#8217;s (excellent) blog post about Removing Screen Resolution and Personalize shell extensions from a users desktop session I couldn&#8217;t help it. I had to write a PowerShell script to take ownership of the mentioned registry keys. So here goes: The code is only quick to show we can do it (after all [...]]]></description> <content:encoded><![CDATA[<p><a  href="http://www.remkoweijnen.nl/blog/wp-content/uploads/2012/01/image11.png" rel="lightbox" class="thickbox no_icon" title="image"><img style="display: inline; float: left;" title="image" src="http://www.remkoweijnen.nl/blog/wp-content/uploads/2012/01/image_thumb11.png" alt="image" width="101" height="70" align="left" /></a>After reading Andy Morgan&#8217;s (excellent) blog post about<a  href="http://andrewmorgan.ie/2012/01/16/removing-screen-resolution-and-personalize-shell-extensions-from-a-users-desktop-session/" target="_blank"> Removing Screen Resolution and Personalize shell extensions from a users desktop session</a> I couldn&#8217;t help it.</p><p><a  href="http://www.remkoweijnen.nl/blog/wp-content/uploads/2012/01/image12.png" rel="lightbox" class="thickbox no_icon" title="image"><img style="display: inline; float: right;" title="image" src="http://www.remkoweijnen.nl/blog/wp-content/uploads/2012/01/image_thumb12.png" alt="image" width="38" height="37" align="right" /></a>I had to write a PowerShell script to take ownership of the mentioned registry keys. So here goes:</p><p><span id="more-2327"></span></p><p>The code is only quick to show we can do it (after all PowerShell has no limits) and could be improved error handling and so on. But it works!</p><div class="dean_ch" style="white-space: wrap;"><span class="re3">$definition</span> = @<span class="st0">&quot;<br /> using System;<br /> using System.Runtime.InteropServices;</p><p>namespace Win32Api<br /> {</p><p>&nbsp; &nbsp;public class NtDll<br /> &nbsp; &nbsp;{<br /> &nbsp; &nbsp;&nbsp; &nbsp;[DllImport(&quot;</span>ntdll.<span class="me1">dll</span><span class="st0">&quot;, EntryPoint=&quot;</span>RtlAdjustPrivilege<span class="st0">&quot;)]<br /> &nbsp; &nbsp;&nbsp; &nbsp;public static extern int RtlAdjustPrivilege(ulong Privilege, bool Enable, bool CurrentThread, ref bool Enabled);<br /> &nbsp; &nbsp;}<br /> }<br /> &quot;</span>@</p><p><span class="re0">Add-<span class="re1">Type</span></span> <span class="re2">-TypeDefinition</span> <span class="re3">$definition</span> <span class="re2">-PassThru</span></p><p><span class="re3">$bEnabled</span> = <span class="re3">$false</span></p><p><span class="co1"># Enable SeTakeOwnershipPrivilege</span><br /> <span class="re3">$res</span> = <span class="re4"><span class="br0">&#91;</span>Win32Api.<span class="me1">NtDll</span><span class="br0">&#93;</span></span>::<span class="me2">RtlAdjustPrivilege</span><span class="br0">&#40;</span><span class="nu0">9</span>, <span class="re3">$true</span>, <span class="re3">$false</span>, <span class="re4"><span class="br0">&#91;</span><span class="kw3">ref</span><span class="br0">&#93;</span></span><span class="re3">$bEnabled</span><span class="br0">&#41;</span></p><p><span class="re3">$key</span> = <span class="re4"><span class="br0">&#91;</span><span class="kw3">Microsoft</span>.<span class="me1">Win32</span>.<span class="me1">Registry</span><span class="br0">&#93;</span></span>::<span class="me2">ClassesRoot</span>.<span class="me1">OpenSubKey</span><span class="br0">&#40;</span><span class="st0">&quot;DesktopBackground\Shell\Display&quot;</span>, <span class="re4"><span class="br0">&#91;</span><span class="kw3">Microsoft</span>.<span class="me1">Win32</span>.<span class="me1">RegistryKeyPermissionCheck</span><span class="br0">&#93;</span></span>::<span class="me2">ReadWriteSubTree</span>,<span class="re4"><span class="br0">&#91;</span><span class="kw3">System</span>.<span class="me1">Security</span>.<span class="me1">AccessControl</span>.<span class="me1">RegistryRights</span><span class="br0">&#93;</span></span>::<span class="me2">takeownership</span><span class="br0">&#41;</span><br /> <span class="re3">$acl</span> = <span class="re3">$key</span>.<span class="me1">GetAccessControl</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br /> <span class="re3">$acl</span>.<span class="me1">SetOwner</span><span class="br0">&#40;</span><span class="re4"><span class="br0">&#91;</span><span class="kw3">System</span>.<span class="me1">Security</span>.<span class="me1">Principal</span>.<span class="me1">NTAccount</span><span class="br0">&#93;</span></span><span class="st0">&quot;Administrators&quot;</span><span class="br0">&#41;</span><br /> <span class="re3">$key</span>.<span class="me1">SetAccessControl</span><span class="br0">&#40;</span><span class="re3">$acl</span><span class="br0">&#41;</span></div> ]]></content:encoded> <wfw:commentRss>http://www.remkoweijnen.nl/blog/2012/01/16/take-ownership-of-a-registry-key-in-powershell/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Read Maximum Password Age with PowerShell</title><link>http://www.remkoweijnen.nl/blog/2011/12/02/read-maximum-password-age-with-powershell/</link> <comments>http://www.remkoweijnen.nl/blog/2011/12/02/read-maximum-password-age-with-powershell/#comments</comments> <pubDate>Fri, 02 Dec 2011 12:47:44 +0000</pubDate> <dc:creator>Remko</dc:creator> <category><![CDATA[Active Directory]]></category> <category><![CDATA[PowerShell]]></category> <category><![CDATA[maxPwdAge]]></category><guid isPermaLink="false">http://www.remkoweijnen.nl/blog/2011/12/02/read-maximum-password-age-with-powershell/</guid> <description><![CDATA[I needed to read out the Maximum Password age with a PowerShell script in a Windows 2003 domain. Reading out the maxPwdAge attribute is a trivial task&#160; in PowerShell (I am re-using the function AdsLargeIntegerToInt64): # Read Maximum Password Age (from Domain Policy) # Read maxPwdAge attribute and convert to Int64 $maxPwdAge = AdsLargeIntegerToIn64 $Domain.maxPwdAge.Value&#40; [...]]]></description> <content:encoded><![CDATA[<p><a  href="http://www.remkoweijnen.nl/blog/wp-content/uploads/2011/12/image1.png" rel="lightbox" class="thickbox no_icon" title="image"><img style="margin: 0px 5px 0px 0px; display: inline; float: left" title="image" alt="image" align="left" src="http://www.remkoweijnen.nl/blog/wp-content/uploads/2011/12/image_thumb1.png" width="33" height="39" /></a>I needed to read out the Maximum Password age with a PowerShell script in a Windows 2003 domain.</p><p>Reading out the <a  href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms676863(v=vs.85).aspx" target="_blank">maxPwdAge</a> attribute is a trivial task&#160; in PowerShell (I am re-using the function <a  href="http://www.remkoweijnen.nl/blog/2011/12/01/convert-iadslargeinteger-to-int64-in-powershell/" target="_blank">AdsLargeIntegerToInt64</a>):</p><div class="dean_ch" style="white-space: wrap;"><span class="co1"># Read Maximum Password Age (from Domain Policy)</span><br /> <span class="co1"># Read maxPwdAge attribute and convert to Int64</span><br /> <span class="re3">$maxPwdAge</span> = AdsLargeIntegerToIn64 <span class="re3">$Domain</span>.<span class="me1">maxPwdAge</span>.<span class="me1">Value</span><span class="br0">&#40;</span></div><p>In my case this returns the value -78624000000000 but how do we interpret this?<br /></p><p><span id="more-2212"></span><p>The value is expressed in 100 nanosecond units which is the same unit as a windows <a  href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms724284(v=vs.85).aspx" target="_blank">FILETIME</a> structure uses.</p><p>Knowing that we can use the FromTicks method from the .NET <a  href="http://msdn.microsoft.com/en-us/library/system.timespan.aspx" target="_blank">TimeSpan</a> structure to convert it to the number of days:</p><div class="dean_ch" style="white-space: wrap;"><span class="re3">$maxPwdDays</span> = <span class="re4"><span class="br0">&#91;</span><span class="kw3">System</span>.<span class="me1">TimeSpan</span><span class="br0">&#93;</span></span>::<span class="me2">FromTicks</span><span class="br0">&#40;</span><span class="re4"><span class="br0">&#91;</span><span class="kw3">System</span>.<span class="me1">Math</span><span class="br0">&#93;</span></span>::<span class="me2">ABS</span><span class="br0">&#40;</span><span class="re3">$maxPwdAge</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">Days</span></div><p>And $maxPwdDays is 91 in my case.</p><p>Note that I am using ABS to make the value positive since maxPwdAge is always negative.</p> ]]></content:encoded> <wfw:commentRss>http://www.remkoweijnen.nl/blog/2011/12/02/read-maximum-password-age-with-powershell/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Embedding images in HTML</title><link>http://www.remkoweijnen.nl/blog/2011/12/02/embedding-images-in-html/</link> <comments>http://www.remkoweijnen.nl/blog/2011/12/02/embedding-images-in-html/#comments</comments> <pubDate>Fri, 02 Dec 2011 12:09:43 +0000</pubDate> <dc:creator>Remko</dc:creator> <category><![CDATA[PowerShell]]></category> <category><![CDATA[script]]></category> <category><![CDATA[base64]]></category> <category><![CDATA[embed]]></category> <category><![CDATA[hta]]></category><guid isPermaLink="false">http://www.remkoweijnen.nl/blog/2011/12/02/embedding-images-in-html/</guid> <description><![CDATA[I was creating a small dialog in an .hta file and to make a little prettier for the user I included a company logo: But I wanted to deploy the .hta as a single file. And this can be done using data: followed by a base64 encoded png: &#60;img&#38;#160; src=&#34;data:image/png;base64, The Base64 encoding can easily [...]]]></description> <content:encoded><![CDATA[<p>I was creating a small dialog in an <a  href="http://en.wikipedia.org/wiki/HTML_Application" target="_blank">.hta file</a> and to make a little prettier for the user I included a company logo:</p><p><a  href="http://www.remkoweijnen.nl/blog/wp-content/uploads/2011/12/SNAGHTMLdfa805.png" rel="lightbox" class="thickbox no_icon" title="SNAGHTMLdfa805"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="SNAGHTMLdfa805" border="0" alt="SNAGHTMLdfa805" src="http://www.remkoweijnen.nl/blog/wp-content/uploads/2011/12/SNAGHTMLdfa805_thumb.png" width="270" height="206" /></a></p><p>But I wanted to deploy the .hta as a single file.</p><p><span id="more-2209"></span><p>And this can be done using data: followed by a base64 encoded png:</p><div class="dean_ch" style="white-space: wrap;">&lt;img&amp;#160; src=&quot;data:image/png;base64,</div><p>The Base64 encoding can easily be done with PowerShell:</p><div class="dean_ch" style="white-space: wrap;"><span class="kw1">function</span> <span class="re0">ConvertTo-<span class="re1">Base64</span></span><span class="br0">&#40;</span><span class="re3">$path</span><span class="br0">&#41;</span> <br /> <span class="br0">&#123;</span><br /> &nbsp; &nbsp;<span class="kw1">return</span> <span class="re4"><span class="br0">&#91;</span>Convert<span class="br0">&#93;</span></span>::<span class="me2">ToBase64String</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">Get-<span class="re1">Content</span></span> <span class="re3">$path</span> <span class="re2">-Encoding</span> <span class="kw3">byte</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br /> <span class="br0">&#125;</span></p><p><span class="re0">ConvertTo-<span class="re1">Base64</span></span> <span class="st0">&quot;Picture.png&quot;</span></div><p>Example:</p><div class="dean_ch" style="white-space: wrap;">&lt;img src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADUAAAArCAIAAABXWFfMAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAaBJREFUWEftmNsOwyAIhrv3f+iuU2eonA9LXFLTq03sJz8I9nWe57HzuPh2HsfOcB9tH76UB2r8hxMsBQWMg3wLUIuT24MmBIEjfNe7MZD8SzOJDJ9Z94oXrs//2voorXwZMrgfL6WJL+wzztN2uXW+crgpt0VphY+H64sHY9GOGODD25Yp53ziDFJdKPFRzuMWJBHJyesxKSOyfIyyTdT7YITmZq5RIecKzSfAMXw4Fq18fb+CLsRfab6xJl/lrCq7/Dcm1+pb6L8/4CP9zZ0vev6qByHxPlvBsJ/P7Pm31GVuN+vvNr5U5SD7xYcvUY65I9B7vhTLGsmPXiHwfSLZrQjmBfXjp0lTw1fV4gNNh0oFfHjRsNyzPM4V3HxkCFYhLqES6a9GcaCuknmVIZ96UQr0971diz/TXIXrTaU0OJQMYiWfHIiq1kunCOdbnKf7TwhEmH0kh0BvhLPyzTtHJuxiX2H07wcwPFVB5SJmdxvsGeUMsd+epIwOkM0G2M1HXTGJfgIGZeQdzcanL3tLRQkSBloMa/iqaPA6u/O9ARufjI6hiJD2AAAAAElFTkSuQmCC&quot; /&gt;<br /> &lt;/PRE&lt;p&gt;</div> ]]></content:encoded> <wfw:commentRss>http://www.remkoweijnen.nl/blog/2011/12/02/embedding-images-in-html/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Convert IADsLargeInteger to Int64 in PowerShell</title><link>http://www.remkoweijnen.nl/blog/2011/12/01/convert-iadslargeinteger-to-int64-in-powershell/</link> <comments>http://www.remkoweijnen.nl/blog/2011/12/01/convert-iadslargeinteger-to-int64-in-powershell/#comments</comments> <pubDate>Thu, 01 Dec 2011 15:03:46 +0000</pubDate> <dc:creator>Remko</dc:creator> <category><![CDATA[Active Directory]]></category> <category><![CDATA[PowerShell]]></category> <category><![CDATA[IADsLargeInteger]]></category> <category><![CDATA[pwdLastSet]]></category><guid isPermaLink="false">http://www.remkoweijnen.nl/blog/2011/12/01/convert-iadslargeinteger-to-int64-in-powershell/</guid> <description><![CDATA[Some Active Directory attributes return an 8 byte integer in the form of an IADsLargeInteger interface. An example is the pwdLastSet attribute from a user object. Because the IADsLargeInteger object doesn&#8217;t provide type information PowerShell cannot read the HighPart and LowPart properties. So I wrote the function below to get the Int64 value of an [...]]]></description> <content:encoded><![CDATA[<p><img style="display: inline; float: right;" src="data:image/jpeg;base64,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" alt="" width="70" height="67" align="right" />Some Active Directory attributes return an 8 byte integer in the form of an <a href="file://\\LargeInteger" target="_blank">IADsLargeInteger</a> interface. An example is the pwdLastSet attribute from a user object.</p><p>Because the IADsLargeInteger object doesn&#8217;t provide type information PowerShell cannot read the HighPart and LowPart properties.</p><p>So I wrote the function below to get the Int64 value of an IADsLargeInteger:</p><p><span id="more-2200"></span></p><div class="dean_ch" style="white-space: wrap;"><span class="kw1">function</span> AdsLargeIntegerToIn64<span class="br0">&#40;</span><span class="re3">$adsLargeInteger</span><span class="br0">&#41;</span><br /> <span class="br0">&#123;</span><br /> &nbsp; &nbsp;<span class="re4"><span class="br0">&#91;</span>Int32<span class="br0">&#93;</span></span><span class="re3">$highPart</span> = <span class="re3">$adsLargeInteger</span>.<span class="me1">GetType</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">InvokeMember</span><span class="br0">&#40;</span><span class="st0">&quot;HighPart&quot;</span>, <span class="re4"><span class="br0">&#91;</span><span class="kw3">System</span>.<span class="me1">Reflection</span>.<span class="me1">BindingFlags</span><span class="br0">&#93;</span></span>::<span class="me2">GetProperty</span>, <span class="re3">$null</span>, <span class="re3">$adsLargeInteger</span>, <span class="re3">$null</span><span class="br0">&#41;</span><br /> &nbsp; &nbsp;<span class="re4"><span class="br0">&#91;</span>Int32<span class="br0">&#93;</span></span><span class="re3">$lowPart</span> &nbsp;= <span class="re3">$adsLargeInteger</span>.<span class="me1">GetType</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">InvokeMember</span><span class="br0">&#40;</span><span class="st0">&quot;LowPart&quot;</span>, &nbsp;<span class="re4"><span class="br0">&#91;</span><span class="kw3">System</span>.<span class="me1">Reflection</span>.<span class="me1">BindingFlags</span><span class="br0">&#93;</span></span>::<span class="me2">GetProperty</span>, <span class="re3">$null</span>, <span class="re3">$adsLargeInteger</span>, <span class="re3">$null</span><span class="br0">&#41;</span><br /> &nbsp; &nbsp;<span class="kw1">return</span>  <span class="re4"><span class="br0">&#91;</span>Int64<span class="br0">&#93;</span></span><span class="br0">&#40;</span><span class="st0">&quot;0x{0:x8}{1:x8}&quot;</span> <span class="re2">-f</span> <span class="re3">$highPart</span>, <span class="re3">$lowpart</span><span class="br0">&#41;</span><br /> <span class="br0">&#125;</span></div> ]]></content:encoded> <wfw:commentRss>http://www.remkoweijnen.nl/blog/2011/12/01/convert-iadslargeinteger-to-int64-in-powershell/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Set homefolder permissions with PowerShell</title><link>http://www.remkoweijnen.nl/blog/2011/11/08/set-homefolder-permissions-with-powershell/</link> <comments>http://www.remkoweijnen.nl/blog/2011/11/08/set-homefolder-permissions-with-powershell/#comments</comments> <pubDate>Tue, 08 Nov 2011 20:05:19 +0000</pubDate> <dc:creator>Remko</dc:creator> <category><![CDATA[PowerShell]]></category> <category><![CDATA[Exchange]]></category> <category><![CDATA[NTFS]]></category> <category><![CDATA[Permissions]]></category><guid isPermaLink="false">http://www.remkoweijnen.nl/blog/2011/11/08/set-homefolder-permissions-with-powershell/</guid> <description><![CDATA[Today one of my collegues asked me to write a script that performs two actions for all users of a certain Organizational Unit: Ensure that each user has modify permissions on their homefolder Make each user visible in the Exchange Address List. Sounds like a PowerShell job right? I reused my function to set NTFS [...]]]></description> <content:encoded><![CDATA[<p><a  href="http://www.remkoweijnen.nl/blog/wp-content/uploads/2011/11/image2.png" rel="lightbox" class="thickbox no_icon" title="image"><img style="margin: 0px 0px 0px 10px; display: inline; float: right;" title="image" src="http://www.remkoweijnen.nl/blog/wp-content/uploads/2011/11/image_thumb2.png" alt="image" width="77" height="66" align="right" /></a>Today one of my collegues asked me to write a script that performs two actions for all users of a certain Organizational Unit:</p><ol><li><span style="color: #35383d;">Ensure that each user has</span> modify permissions on their homefolder</li><li>Make each user visible in the Exchange Address List.</li></ol><p>Sounds like a PowerShell job right?</p><p>I reused my function to <a  href="http://www.remkoweijnen.nl/blog/2011/09/02/settings-ntfs-permissions-by-sid-in-powershell/" target="_blank">set NTFS Permissions by SID</a>:</p><p><span id="more-2154"></span></p><div class="dean_ch" style="white-space: wrap;"><span class="kw1">function</span> SetNTFSPermissionsBySid<span class="br0">&#40;</span><span class="re4"><span class="br0">&#91;</span><span class="kw3">string</span><span class="br0">&#93;</span></span><span class="re3">$directory</span>, <span class="re4"><span class="br0">&#91;</span><span class="kw3">System</span>.<span class="me1">DirectoryServices</span>.<span class="me1">DirectoryEntry</span><span class="br0">&#93;</span></span><span class="re3">$objAD</span><span class="br0">&#41;</span><br /> <span class="br0">&#123;</span><br /> &nbsp; &nbsp; <span class="co1"># Convert byte array sid to sid string</span><br /> &nbsp; &nbsp; <span class="re3">$sID</span> = <span class="re0">New-<span class="re1">Object</span></span> <span class="kw3">System</span>.<span class="me1">Security</span>.<span class="me1">Principal</span>.<span class="me1">SecurityIdentifier</span> <span class="re3">$objAD</span>.<span class="me1">objectsid</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>,<span class="nu0">0</span></p><p>&nbsp; &nbsp; <span class="co1"># Inheritance This Folder, Subfolders and Files)</span><br /> &nbsp; &nbsp; <span class="re3">$inherit</span> = <span class="re4"><span class="br0">&#91;</span><span class="kw3">system</span>.<span class="me1">security</span>.<span class="me1">accesscontrol</span>.<span class="me1">InheritanceFlags</span><span class="br0">&#93;</span></span><span class="st0">&quot;ContainerInherit, ObjectInherit&quot;</span><br /> &nbsp; &nbsp; <span class="re3">$propagation</span> = <span class="re4"><span class="br0">&#91;</span><span class="kw3">system</span>.<span class="me1">security</span>.<span class="me1">accesscontrol</span>.<span class="me1">PropagationFlags</span><span class="br0">&#93;</span></span><span class="st0">&quot;None&quot;</span></p><p>&nbsp; &nbsp; <span class="co1"># Retrieve the ACL</span><br /> &nbsp; &nbsp; <span class="re3">$aCL</span> = <span class="re0">Get-<span class="re1">Acl</span></span> <span class="re3">$directory</span></p><p>&nbsp; &nbsp;<span class="co1"># Create Ace</span><br /> &nbsp; &nbsp; <span class="re3">$accessRule</span> = <span class="re0">New-<span class="re1">Object</span></span> <span class="kw3">System</span>.<span class="me1">Security</span>.<span class="me1">AccessControl</span>.<span class="me1">FileSystemAccessRule</span><span class="br0">&#40;</span><span class="re3">$sID</span>, <span class="st0">&quot;Modify&quot;</span>, <span class="re3">$inherit</span>, <span class="re3">$propagation</span>, <span class="st0">&quot;Allow&quot;</span><span class="br0">&#41;</span></p><p>&nbsp; &nbsp;<span class="co1"># Add Ace to Acl</span><br /> &nbsp; &nbsp;<span class="re3">$aCL</span>.<span class="me1">AddAccessRule</span><span class="br0">&#40;</span><span class="re3">$accessrule</span><span class="br0">&#41;</span></p><p>&nbsp; &nbsp;<span class="co1"># Set Acl to the directory</span><br /> &nbsp; &nbsp; <span class="re0">Set-<span class="re1">Acl</span></span> <span class="re2">-aclobject</span> <span class="re3">$aCL</span> <span class="re2">-path</span> <span class="re3">$directory</span><br /> <span class="br0">&#125;</span></div><p>And then I only needed to get the OU and do a foreach loop on it&#8217;s children:</p><div class="dean_ch" style="white-space: wrap;"><span class="re3">$OU</span> = <span class="re4"><span class="br0">&#91;</span><span class="kw3">ADSI</span><span class="br0">&#93;</span></span><span class="st0">&quot;LDAP://OU=TheOU,OU=Employees,DC=contoso,DC=com&quot;</span><br /> <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re3">$User</span> <span class="kw1">in</span> <span class="re3">$OU</span>.<span class="me1">Children</span><span class="br0">&#41;</span><br /> <span class="br0">&#123;</span><br /> &nbsp; &nbsp;&nbsp; &nbsp;<span class="co1"># Grant Modify Permissions to the user on his homedirectory as specified in AD</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SetNTFSPermissionsBySid <span class="re3">$User</span>.<span class="me1">HomeDirectory</span> <span class="re3">$User</span></p><p>&nbsp; &nbsp;&nbsp; &nbsp;<span class="co1"># Unhide the user from the Exchange Address List</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re3">$User</span>.<span class="me1">msExchHideFromAddressLists</span> = <span class="re3">$false</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re3">$User</span>.<span class="me1">CommitChanges</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br /> <span class="br0">&#125;</span></div> ]]></content:encoded> <wfw:commentRss>http://www.remkoweijnen.nl/blog/2011/11/08/set-homefolder-permissions-with-powershell/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Construct AQS date range with PowerShell</title><link>http://www.remkoweijnen.nl/blog/2011/11/04/construct-aqs-date-range-with-powershell/</link> <comments>http://www.remkoweijnen.nl/blog/2011/11/04/construct-aqs-date-range-with-powershell/#comments</comments> <pubDate>Fri, 04 Nov 2011 15:05:25 +0000</pubDate> <dc:creator>Remko</dc:creator> <category><![CDATA[PowerShell]]></category> <category><![CDATA[AQS]]></category><guid isPermaLink="false">http://www.remkoweijnen.nl/blog/2011/11/04/construct-aqs-date-range-with-powershell/</guid> <description><![CDATA[For a script I needed to create an AQS (Advanced Query Syntax) Query that contained a date range. An example of such is a range is: date:11/05/04..11/10/04 However we need to account for regional settings where for example the data seperator and the order of day and month may be different. In my example I [...]]]></description> <content:encoded><![CDATA[<p><a  href="http://www.remkoweijnen.nl/blog/wp-content/uploads/2011/11/image.png" rel="lightbox" class="thickbox no_icon" title="image"><img style="margin: 0px 7px 0px 0px; display: inline; float: left" title="image" alt="image" align="left" src="http://www.remkoweijnen.nl/blog/wp-content/uploads/2011/11/image_thumb.png" width="53" height="52" /></a>For a script I needed to create an AQS (<a  href="http://msdn.microsoft.com/en-us/library/aa965711(v=vs.85).aspx" target="_blank">Advanced Query Syntax</a>) Query that contained a date range.</p><p>An example of such is a range is: <strong>date:11/05/04..11/10/04</strong></p><p>However we need to account for regional settings where for example the data seperator and the order of day and month may be different.</p><p>In my example I wanted to match any data that is 30 days or older so let&#8217;s do this in PowerShell:</p><p><span id="more-2151"></span><p>First we define a variable for the minimum age:</p><div class="dean_ch" style="white-space: wrap;"><span class="co1"># Minimum Age in Days</span><br /> <span class="re3">$MinAge</span> = <span class="nu0">30</span></div><p align="left"><a  href="http://www.remkoweijnen.nl/blog/wp-content/uploads/2011/11/image1.png" rel="lightbox" class="thickbox no_icon" title="image"><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="right" src="http://www.remkoweijnen.nl/blog/wp-content/uploads/2011/11/image_thumb1.png" width="105" height="88" /></a>Then we use the MinValue property to get the a minimum date value (1/1/0001). This is the From date:</p><div class="dean_ch" style="white-space: wrap;"><span class="co1"># DateFrom is MinValue to catch all</span><br /> <span class="re3">$DateFrom</span> = <span class="re4"><span class="br0">&#91;</span><span class="kw3">System</span>.<span class="me1">DateTime</span><span class="br0">&#93;</span></span>::<span class="me2">MinValue</span>.<span class="me1">ToShortDateString</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div><p>And we use the ToShortDateString method to format the date in the current regional settings.</p><p>Now we can calculate the To Date:</p><div class="dean_ch" style="white-space: wrap;"><span class="co1"># DateTo is the current date &#8211; $MinAge</span><br /> <span class="re3">$DateTo</span> = <span class="re4"><span class="br0">&#91;</span><span class="kw3">System</span>.<span class="me1">DateTime</span><span class="br0">&#93;</span></span>::<span class="me2">Now</span>.<span class="me1">Subtract</span><span class="br0">&#40;</span><span class="re4"><span class="br0">&#91;</span><span class="kw3">System</span>.<span class="me1">TimeSpan</span><span class="br0">&#93;</span></span>::<span class="me2">FromDays</span><span class="br0">&#40;</span><span class="re3">$MinAge</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">ToShortDateString</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div><p>And the last step is to format the AQS Query String:</p><div class="dean_ch" style="white-space: wrap;"><span class="co1"># Now Construct the AQL Query</span><br /> <span class="re3">$AQL</span> = <span class="st0">&#8216;date:{0}..{1}&#8217;</span> <span class="re2">-f</span> <span class="re3">$DateFrom</span>, <span class="re3">$DateTo</span></div><p>In my case the result at the time of writing is:</p><div class="dean_ch" style="white-space: wrap;">date:<span class="nu0">1</span><span class="nu0">-1</span><span class="nu0">-0001</span>..<span class="nu0">4</span><span class="nu0">-10</span><span class="nu0">-2011</span></div> ]]></content:encoded> <wfw:commentRss>http://www.remkoweijnen.nl/blog/2011/11/04/construct-aqs-date-range-with-powershell/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Exchange Move Mailbox Experiences Part 3</title><link>http://www.remkoweijnen.nl/blog/2011/09/28/exchange-move-mailbox-experiences-part-3/</link> <comments>http://www.remkoweijnen.nl/blog/2011/09/28/exchange-move-mailbox-experiences-part-3/#comments</comments> <pubDate>Wed, 28 Sep 2011 09:08:21 +0000</pubDate> <dc:creator>Remko</dc:creator> <category><![CDATA[Exchange]]></category> <category><![CDATA[PowerShell]]></category> <category><![CDATA[Exchange2003]]></category> <category><![CDATA[Exchange2010]]></category><guid isPermaLink="false">http://www.remkoweijnen.nl/blog/2011/09/28/exchange-move-mailbox-experiences-part-3/</guid> <description><![CDATA[In Part 2 I showed some details about Mailbox Rule corruptions that can disturb Mailbox Moves. For this part the topic is Mailbox size, which can be an important factor in deciding which mailboxes you want to move first. In my case the mailbox size was important because we agreed to move smaller mailboxes during [...]]]></description> <content:encoded><![CDATA[<p>In <a  href="http://www.remkoweijnen.nl/blog/2011/09/27/exchange-move-mailbox-experiences-part-2/" target="_blank">Part 2</a> I showed some details about Mailbox Rule corruptions that can disturb Mailbox Moves.</p><p>For this part the topic is Mailbox size, which can be an important factor in deciding which mailboxes you want to move first.</p><p>In my case the mailbox size was important because we agreed to move smaller mailboxes during the day but larger mailboxes only outside working hours.</p><p>For Exchange 2010 mailboxes it&#8217;s very easy to obtain the size using PowerShell.</p><p>Example:</p><div class="dean_ch" style="white-space: wrap;"><span class="re0">Get-<span class="re1">Mailbox</span></span> <span class="st0">&quot;rweijnen&quot;</span> | <span class="re0">Get-<span class="re1">MailboxStatistics</span></span> | <span class="kw4">select</span> DisplayName, ItemCount, TotalItemSize</div><table border="0" cellspacing="10" cellpadding="2" width="430"><tbody><tr><td valign="top" width="130">DisplayName</td><td valign="top" width="70" align="right">ItemCount</td><td valign="top" width="230" align="right">TotalItemSize</td></tr><tr><td valign="top" width="130">Remko Weijnen</td><td valign="top" width="70" align="right">313</td><td valign="top" width="230" align="right">34.87 MB (36,564,183 bytes</td></tr></tbody></table><p>But how can we get the Mailbox Size for Exchange 2003 mailboxes?</p><p>&#160;</p><p><span id="more-2123"></span><p>Using OutlookSpy we can see where this information can be read programmatically.</p><p>Select the Inbox and click IMAPIFolder, then inspect the PR_MESSAGE_SIZE property:</p><p><a  href="http://www.remkoweijnen.nl/blog/wp-content/uploads/2011/09/image29.png" rel="lightbox" class="thickbox no_icon" title="image"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.remkoweijnen.nl/blog/wp-content/uploads/2011/09/image_thumb29.png" width="419" height="244" /></a></p><p>There is one problem however, the type of this property is <a  href="http://msdn.microsoft.com/en-us/library/dd920736(v=office.12).aspx" target="_blank">PT_LONG</a> which is a 4 byte Integer. The maximum value it can hold is 2147483647 (2 GigaByte) after which it will overflow to -1.</p><p>With Outlook 2003 SP1 and higher we can use the <a  href="http://msdn.microsoft.com/en-us/library/aa193128(v=office.11).aspx" target="_blank">PR_MESSAGE_SIZE_EXTENDED</a> property which is a 64 bit Integer.</p><p>I wrote a PowerShell function (requires <a  href="http://www.dimastr.com/redemption/" target="_blank">Redemption</a>) that creates a dynamic MAPI profile, logs on to the desired Mailbox and returns the Mailbox Size:</p><div class="dean_ch" style="white-space: wrap;"><span class="kw1">function</span> GetMailboxSize<span class="br0">&#123;</span><br /> &nbsp; &nbsp;<span class="kw1">param</span><span class="br0">&#40;</span> &nbsp;<br /> &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>Parameter<span class="br0">&#40;</span><br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Position=<span class="nu0">0</span>, <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Mandatory=<span class="re3">$true</span>, <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ValueFromPipeline=<span class="re3">$true</span>,<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ValueFromPipelineByPropertyName=<span class="re3">$true</span><span class="br0">&#41;</span><br /> &nbsp; &nbsp; &nbsp; <span class="br0">&#93;</span><br /> &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>Alias<span class="br0">&#40;</span><span class="st0">&#8216;User or Mailbox object&#8217;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><br /> &nbsp; &nbsp; &nbsp; <span class="re4"><span class="br0">&#91;</span>Object<span class="br0">&#93;</span></span><span class="re3">$Mbx</span><br /> &nbsp; &nbsp; <span class="br0">&#41;</span></p><p>&nbsp; &nbsp;<span class="co1"># -1 means Unknown</span><br /> &nbsp; &nbsp;<span class="re3">$result</span> = <span class="nu0">-1</span><br /> &nbsp; &nbsp;<br /> &nbsp; &nbsp;<span class="co1"># Create RDOSession Object</span><br /> &nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span>!<span class="br0">&#40;</span><span class="re3">$rDOSession</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="re3">$rDOSession</span> = <span class="re0">New-<span class="re1">Object</span></span> <span class="re2">-ComObject</span> <span class="st0">&quot;Redemption.RDOSession&quot;</span> <span class="br0">&#125;</span><br /> &nbsp; &nbsp;<span class="kw1">try</span><br /> &nbsp; &nbsp;<span class="br0">&#123;</span><br /> &nbsp; &nbsp;&nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="re3">$rDOSession</span>.<span class="me1">LoggedOn</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="re3">$rDOSession</span>.<span class="me1">Logoff</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#125;</span><br /> &nbsp; &nbsp;&nbsp; &nbsp;<span class="re3">$rDOSession</span>.<span class="me1">LogonExchangeMailbox</span><span class="br0">&#40;</span><span class="re3">$Mbx</span>.<span class="me1">LegacyExchangeDn</span>, <span class="re3">$Mbx</span>.<span class="me1">Server</span><span class="br0">&#41;</span><br /> &nbsp; &nbsp;<br /> &nbsp; &nbsp;&nbsp; &nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="re3">$rDOSession</span>.<span class="me1">LoggedOn</span><span class="br0">&#41;</span> <br /> &nbsp; &nbsp;&nbsp; &nbsp;<span class="br0">&#123;</span> <br /> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<span class="co1"># Get Mailbox Size, note that PR_MESSAGE_SIZE is max 2 GB therefore we</span><br /> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<span class="co1"># user PR_MESSAGE_SIZE_EXTENDED</span><br /> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<span class="re3">$result</span> = <span class="br0">&#40;</span><span class="re3">$rDOSession</span>.<span class="me1">Stores</span>.<span class="me1">DefaultStore</span>.<span class="me1">Fields</span><span class="br0">&#40;</span><span class="re3">$PR_MESSAGE_SIZE_EXTENDED</span><span class="br0">&#41;</span><span class="br0">&#41;</span>&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br /> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<span class="re3">$rDOSession</span>.<span class="me1">Logoff</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <br /> &nbsp; &nbsp;&nbsp; &nbsp;<span class="br0">&#125;</span><br /> &nbsp; &nbsp;<span class="br0">&#125;</span><br /> &nbsp; &nbsp;<span class="kw1">catch</span><br /> &nbsp; &nbsp;<span class="br0">&#123;</span><br /> &nbsp; &nbsp;&nbsp; &nbsp;<span class="co1"># Add your Exception handling code here</span><br /> &nbsp; &nbsp;&nbsp; &nbsp;<span class="co1"># [system.exception]</span><br /> &nbsp; &nbsp;&nbsp; &nbsp;<span class="co1"># &quot;exception&quot;</span><br /> &nbsp; &nbsp;<span class="br0">&#125;</span><br /> &nbsp; &nbsp;<span class="kw1">finally</span><br /> &nbsp; &nbsp;<span class="br0">&#123;</span><br /> &nbsp; &nbsp;&nbsp; &nbsp;<span class="kw1">return</span> <span class="re3">$result</span><br /> &nbsp; &nbsp;<span class="br0">&#125;</span><br /> <span class="br0">&#125;</span></div> ]]></content:encoded> <wfw:commentRss>http://www.remkoweijnen.nl/blog/2011/09/28/exchange-move-mailbox-experiences-part-3/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Inline arrays in PowerShell</title><link>http://www.remkoweijnen.nl/blog/2011/09/28/inline-arrays-in-powershell/</link> <comments>http://www.remkoweijnen.nl/blog/2011/09/28/inline-arrays-in-powershell/#comments</comments> <pubDate>Wed, 28 Sep 2011 08:34:18 +0000</pubDate> <dc:creator>Remko</dc:creator> <category><![CDATA[PowerShell]]></category><guid isPermaLink="false">http://www.remkoweijnen.nl/blog/2011/09/28/inline-arrays-in-powershell/</guid> <description><![CDATA[Sometimes I want to process a list of &#8220;things&#8221; easily in PowerShell where the list is not in an external file but in the script itself. Ideally this list would not be separated by e.g. a comma so it can be easily copy/pasted from external data sources. Something like this: $List = @&#40;&#34; John Doe [...]]]></description> <content:encoded><![CDATA[<p><a  href="http://www.remkoweijnen.nl/blog/wp-content/uploads/2011/09/image28.png" rel="lightbox" class="thickbox no_icon" title="image"><img style="background-image: none; margin: 0px 0px 0px 16px; padding-left: 0px; padding-right: 0px; display: inline; float: right; padding-top: 0px; border: 0px;" title="image" src="http://www.remkoweijnen.nl/blog/wp-content/uploads/2011/09/image_thumb28.png" alt="image" width="119" height="79" align="right" border="0" /></a>Sometimes I want to process a list of &#8220;things&#8221; easily in PowerShell where the list is not in an external file but in the script itself.</p><p>Ideally this list would not be separated by e.g. a comma so it can be easily copy/pasted from external data sources.</p><p>Something like this:</p><div class="dean_ch" style="white-space: wrap;"><span class="re3">$List</span> = @<span class="br0">&#40;</span><span class="st0">&quot;<br /> John Doe<br /> Jane Doe<br /> James Bond<br /> And so the list goes on<br /> &quot;</span><span class="br0">&#41;</span></div><p><span id="more-2119"></span></p><p>With a little trickery we can!</p><div class="dean_ch" style="white-space: wrap;"> <span class="re3">$List</span> = @<span class="br0">&#40;</span><span class="st0">&quot;<br /> John Doe<br /> Jane Doe<br /> James Bond<br /> And so the list goes on<br /> &quot;</span><span class="br0">&#41;</span> <span class="re2">-split</span> <span class="st0">&quot;<span class="es0">`n</span>&quot;</span> | <span class="kw4">where</span> <span class="br0">&#123;</span><span class="re4"><span class="br0">&#91;</span><span class="kw3">byte</span><span class="br0">&#93;</span></span><span class="re3">$_</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span> <span class="re2">-ne</span> 0&#215;0<span class="br0">&#125;</span></p><p><span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re3">$Entry</span> <span class="kw1">in</span> <span class="re3">$List</span><span class="br0">&#41;</span><br /> <span class="br0">&#123;</span><br /> &nbsp; &nbsp;<span class="st0">&quot;Performing surgery on $Entry&quot;</span><br /> <span class="br0">&#125;</span><br /> &nbsp;</div> ]]></content:encoded> <wfw:commentRss>http://www.remkoweijnen.nl/blog/2011/09/28/inline-arrays-in-powershell/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Settings NTFS Permissions by SID in PowerShell</title><link>http://www.remkoweijnen.nl/blog/2011/09/02/settings-ntfs-permissions-by-sid-in-powershell/</link> <comments>http://www.remkoweijnen.nl/blog/2011/09/02/settings-ntfs-permissions-by-sid-in-powershell/#comments</comments> <pubDate>Fri, 02 Sep 2011 15:21:42 +0000</pubDate> <dc:creator>Remko</dc:creator> <category><![CDATA[Active Directory]]></category> <category><![CDATA[PowerShell]]></category> <category><![CDATA[ADSI]]></category> <category><![CDATA[Security]]></category><guid isPermaLink="false">http://www.remkoweijnen.nl/blog/2011/09/02/settings-ntfs-permissions-by-sid-in-powershell/</guid> <description><![CDATA[I am currently creating a PowerShell script that creates a user with all needed Active Directory attributes, Exchange mailbox, (TS) Home- and Profile directories and so on. In such a script you can easily get failures because of Active Directory replication. Image that you create a new user account and later on you need set [...]]]></description> <content:encoded><![CDATA[<p><img style="margin: 0px 0px 0px 10px" align="right" src="http://t0.gstatic.com/images?q=tbn:ANd9GcTPzlU95MOmfR0YwGb55TQkoZENCxgxFUKqp6qqfMMaa9skPMT5gw" width="60" height="47" />I am currently creating a PowerShell script that creates a user with all needed Active Directory attributes, Exchange mailbox, (TS) Home- and Profile directories and so on.</p><p>In such a script you can easily get failures because of Active Directory replication.</p><p><span id="more-2046"></span><p><a  href="http://www.remkoweijnen.nl/blog/wp-content/uploads/2011/09/image.png" rel="lightbox" class="thickbox no_icon" title="image"><img style="background-image: none; border-right-width: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://www.remkoweijnen.nl/blog/wp-content/uploads/2011/09/image_thumb.png" width="37" height="36" /></a>Image that you create a new user account and later on you need set an additional attribute. What happens if the user was created while connected to Domain Controller A and you try to set an additional attribute while connected to Domain Controller B before replication has completed?</p><p>We can prevent this easily by performing all actions on the same domain controller. In my script I query for any Domain Controller that has the Global Catalog role:</p><div class="dean_ch" style="white-space: wrap;"><span class="co1"># We will use a single domain controller for all operations to prevent</span><br /> <span class="co1"># replication issues</span><br /> <span class="re3">$DC</span> = <span class="br0">&#40;</span><span class="re0">Get-<span class="re1">DomainController</span></span> <span class="re2">-GlobalCatalog</span> <span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="me1">DnsHostName</span> &nbsp; &nbsp; &nbsp;</div><p>Insert the $DC variable in your ldap binding eg:</p><div class="dean_ch" style="white-space: wrap;"><span class="re3">$User</span> = <span class="re4"><span class="br0">&#91;</span><span class="kw3">ADSI</span><span class="br0">&#93;</span></span><span class="br0">&#40;</span><span class="st0">&quot;LDAP://{0}/CN=Administrator,CN=Users,DC=Contoso,DC=com&quot;</span> <span class="re2">-f</span> <span class="re3">$DC</span><span class="br0">&#41;</span></div><p>Next problem is when you perform non ADSI operations such as setting NTFS permissions on a fileserver (eg homedirectory).</p><p>This server may not yet be able to resolve the username to it&#8217;s SID and thus the operation may fail!</p><p>We can solve this easily by giving permissions to the SID directory instead to the username. Example:</p><div class="dean_ch" style="white-space: wrap;"><span class="kw1">function</span> SetNTFSPermissionsBySid<span class="br0">&#40;</span><span class="re4"><span class="br0">&#91;</span><span class="kw3">string</span><span class="br0">&#93;</span></span><span class="re3">$directory</span>, <span class="re4"><span class="br0">&#91;</span><span class="kw3">System</span>.<span class="me1">DirectoryServices</span>.<span class="me1">DirectoryEntry</span><span class="br0">&#93;</span></span><span class="re3">$objAD</span><span class="br0">&#41;</span><br /> <span class="br0">&#123;</span><br /> &nbsp; &nbsp;<span class="co1"># Convert byte array sid to sid string</span><br /> &nbsp; &nbsp;<span class="re3">$sID</span> = <span class="re0">New-<span class="re1">Object</span></span> <span class="kw3">System</span>.<span class="me1">Security</span>.<span class="me1">Principal</span>.<span class="me1">SecurityIdentifier</span> <span class="re3">$objAD</span>.<span class="me1">objectsid</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>,<span class="nu0">0</span><br /> &nbsp; &nbsp;<br /> &nbsp; &nbsp;<span class="co1"># Inheritance This Folder, Subfolders and Files)</span><br /> &nbsp; &nbsp;<span class="re3">$inherit</span> = <span class="re4"><span class="br0">&#91;</span><span class="kw3">system</span>.<span class="me1">security</span>.<span class="me1">accesscontrol</span>.<span class="me1">InheritanceFlags</span><span class="br0">&#93;</span></span><span class="st0">&quot;ContainerInherit, ObjectInherit&quot;</span><br /> &nbsp; &nbsp;<span class="re3">$propagation</span> = <span class="re4"><span class="br0">&#91;</span><span class="kw3">system</span>.<span class="me1">security</span>.<span class="me1">accesscontrol</span>.<span class="me1">PropagationFlags</span><span class="br0">&#93;</span></span><span class="st0">&quot;None&quot;</span><br /> &nbsp; &nbsp;<br /> &nbsp; &nbsp;<span class="co1"># Retrieve the ACL</span><br /> &nbsp; &nbsp;<span class="re3">$aCL</span> = <span class="re0">Get-<span class="re1">Acl</span></span> <span class="re3">$directory</span></p><p>&nbsp; &nbsp;<span class="co1"># Create Ace</span><br /> &nbsp; &nbsp;<span class="re3">$accessRule</span> = <span class="re0">New-<span class="re1">Object</span></span> <span class="kw3">System</span>.<span class="me1">Security</span>.<span class="me1">AccessControl</span>.<span class="me1">FileSystemAccessRule</span><span class="br0">&#40;</span><span class="re3">$sID</span>, <span class="st0">&quot;Modify&quot;</span>, <span class="re3">$inherit</span>, <span class="re3">$propagation</span>, <span class="st0">&quot;Allow&quot;</span><span class="br0">&#41;</span></p><p>&nbsp; &nbsp;<span class="co1"># Add Ace to Acl&nbsp; </span><br /> &nbsp; &nbsp;<span class="re3">$aCL</span>.<span class="me1">AddAccessRule</span><span class="br0">&#40;</span><span class="re3">$accessrule</span><span class="br0">&#41;</span></p><p>&nbsp; &nbsp;<span class="co1"># Set Acl to the directory</span><br /> &nbsp; &nbsp;<span class="re0">Set-<span class="re1">Acl</span></span> <span class="re2">-aclobject</span> <span class="re3">$aCL</span> <span class="re2">-path</span> <span class="re3">$directory</span><br /> <span class="br0">&#125;</span></div> ]]></content:encoded> <wfw:commentRss>http://www.remkoweijnen.nl/blog/2011/09/02/settings-ntfs-permissions-by-sid-in-powershell/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Check if a useraccount exists with PowerShell</title><link>http://www.remkoweijnen.nl/blog/2011/09/02/check-if-a-useraccount-exists-with-powershell/</link> <comments>http://www.remkoweijnen.nl/blog/2011/09/02/check-if-a-useraccount-exists-with-powershell/#comments</comments> <pubDate>Fri, 02 Sep 2011 09:51:37 +0000</pubDate> <dc:creator>Remko</dc:creator> <category><![CDATA[Active Directory]]></category> <category><![CDATA[PowerShell]]></category><guid isPermaLink="false">http://www.remkoweijnen.nl/blog/2011/09/02/check-if-a-useraccount-exists-with-powershell/</guid> <description><![CDATA[Function below can be used to check if a given Username exists in Active Directory: function UserExists&#40;&#91;string&#93;$Username&#41; &#123; &#160; &#160;$strFilter = &#34;(&#38;(objectCategory=person)(sAMAccountName=$Username))&#34; &#160; &#160;$objDomain = New-Object System.DirectoryServices.DirectoryEntry &#160; &#160;$objSearcher = New-Object System.DirectoryServices.DirectorySearcher &#160; &#160;$objSearcher.SearchRoot = $objDomain &#160; &#160;$objSearcher.PageSize = 1000 &#160; &#160;$objSearcher.Filter = $strFilter &#160; &#160;$objSearcher.SearchScope = &#34;Subtree&#34; &#160; &#160;$colResults = $objSearcher.FindAll&#40;&#41; &#160; &#160;return &#91;bool&#93;&#40;$colResults [...]]]></description> <content:encoded><![CDATA[<p>Function below can be used to check if a given Username exists in Active Directory:<div class="dean_ch" style="white-space: wrap;"> <span class="kw1">function</span> UserExists<span class="br0">&#40;</span><span class="re4"><span class="br0">&#91;</span><span class="kw3">string</span><span class="br0">&#93;</span></span><span class="re3">$Username</span><span class="br0">&#41;</span><br /> <span class="br0">&#123;</span><br /> &nbsp; &nbsp;<span class="re3">$strFilter</span> = <span class="st0">&quot;(&amp;(objectCategory=person)(sAMAccountName=$Username))&quot;</span></p><p>&nbsp; &nbsp;<span class="re3">$objDomain</span> = <span class="re0">New-<span class="re1">Object</span></span> <span class="kw3">System</span>.<span class="me1">DirectoryServices</span>.<span class="me1">DirectoryEntry</span></p><p>&nbsp; &nbsp;<span class="re3">$objSearcher</span> = <span class="re0">New-<span class="re1">Object</span></span> <span class="kw3">System</span>.<span class="me1">DirectoryServices</span>.<span class="me1">DirectorySearcher</span><br /> &nbsp; &nbsp;<span class="re3">$objSearcher</span>.<span class="me1">SearchRoot</span> = <span class="re3">$objDomain</span><br /> &nbsp; &nbsp;<span class="re3">$objSearcher</span>.<span class="me1">PageSize</span> = <span class="nu0">1000</span><br /> &nbsp; &nbsp;<span class="re3">$objSearcher</span>.<span class="kw1">Filter</span> = <span class="re3">$strFilter</span><br /> &nbsp; &nbsp;<span class="re3">$objSearcher</span>.<span class="me1">SearchScope</span> = <span class="st0">&quot;Subtree&quot;</span></p><p>&nbsp; &nbsp;<span class="re3">$colResults</span> = <span class="re3">$objSearcher</span>.<span class="me1">FindAll</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br /> &nbsp; &nbsp;<span class="kw1">return</span> <span class="re4"><span class="br0">&#91;</span><span class="kw3">bool</span><span class="br0">&#93;</span></span><span class="br0">&#40;</span><span class="re3">$colResults</span> <span class="re2">-ne</span> <span class="re3">$null</span><span class="br0">&#41;</span><br /> <span class="br0">&#125;</span><br /> &nbsp;</div> ]]></content:encoded> <wfw:commentRss>http://www.remkoweijnen.nl/blog/2011/09/02/check-if-a-useraccount-exists-with-powershell/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
