<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://powershell.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Dreaming in PowerShell : NTFS</title><link>http://powershell.com/cs/blogs/tobias/archive/tags/NTFS/default.aspx</link><description>Tags: NTFS</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 (Build: 30929.2835)</generator><item><title>Applying NTFS Permissions</title><link>http://powershell.com/cs/blogs/tobias/archive/2011/09/21/applying-ntfs-permissions.aspx</link><pubDate>Wed, 21 Sep 2011 10:21:00 GMT</pubDate><guid isPermaLink="false">f421715f-7aba-45f0-8a8d-44de5318a3a7:12433</guid><dc:creator>Tobias</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://powershell.com/cs/blogs/tobias/rsscomments.aspx?PostID=12433</wfw:commentRss><comments>http://powershell.com/cs/blogs/tobias/archive/2011/09/21/applying-ntfs-permissions.aspx#comments</comments><description>&lt;p&gt;Recently, I needed to &lt;strong&gt;create a folder with NTFS permissions&lt;/strong&gt;. PowerShell can do that for you, and when you look at your weapons, you&amp;#39;ll find that sometimes it is best to mix command types and not just stick to cmdlets. At the end, I had a handy function that would take a path and a username and do all the tricky NTFS permissions stuff for me. Here is how.&lt;/p&gt;
&lt;h3&gt;Creating Folders&lt;/h3&gt;
&lt;p&gt;Let&amp;#39;s start with the simple part and write a function that creates a folder if that folder does not yet exist:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Create-Folder&lt;/span&gt;&lt;/span&gt; {&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;param&lt;/span&gt;&lt;/span&gt;(&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt;) &lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; ( (&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Test-Path&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt;) &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-ne&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$true&lt;/span&gt;&lt;/span&gt;) {&lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;New-Item&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Path&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ItemType&lt;/span&gt;&lt;/span&gt; Directory | &lt;span style="color:#5f9ea0;"&gt;&lt;span class="verbnoun"&gt;Out-Null&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;}&lt;/div&gt;
&lt;h3&gt;Apply Permissions&lt;/h3&gt;
&lt;p&gt;Next, I want to &lt;strong&gt;add NTFS permissions&lt;/strong&gt; to that folder. A specifc user should get change permission, and all Administrators should get full permission. There are cmdlets to do the job like &lt;strong&gt;Get/Set-ACL&lt;/strong&gt;, but working with them can be hard because they really are just simple wrappers for low-level .NET methods. &lt;/p&gt;
&lt;p&gt;PowerShell is not limited to cmdlets. You can happily use established console-based applications like &lt;strong&gt;cacls.exe&lt;/strong&gt;. Here is an example:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt;&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Create-Folder&lt;/span&gt;&lt;/span&gt; {&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;param&lt;/span&gt;&lt;/span&gt;(&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt;, &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$user&lt;/span&gt;&lt;/span&gt;) &lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; ( (&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Test-Path&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt;) &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-ne&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$true&lt;/span&gt;&lt;/span&gt;) {&lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;New-Item&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Path&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ItemType&lt;/span&gt;&lt;/span&gt; Directory | &lt;span style="color:#5f9ea0;"&gt;&lt;span class="verbnoun"&gt;Out-Null&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;CACLS &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;/&lt;/span&gt;&lt;/span&gt;G &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;&amp;quot;Domain Admins&amp;quot;&lt;/span&gt;&lt;/span&gt;:F &lt;br /&gt;CACLS &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt; &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;/&lt;/span&gt;&lt;/span&gt;E &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;/&lt;/span&gt;&lt;/span&gt;G &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$user:C&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;}&lt;/div&gt;
&lt;p&gt;As it turns out, this won&amp;#39;t work yet. The first call to &lt;strong&gt;CACLS&lt;/strong&gt; removes existing permissions which is what I want. However, this triggers a confirmation, so I would have to manually &lt;strong&gt;type &amp;quot;Y&amp;quot; to approve&lt;/strong&gt; the operation. The second call to &lt;strong&gt;CACLS&lt;/strong&gt; won&amp;#39;t work at all. &lt;strong&gt;CACLS&lt;/strong&gt; can&amp;#39;t understand it, so it throws back its manual to the caller.&lt;/p&gt;
&lt;p&gt;To correct these issues, &lt;strong&gt;a couple of tricks are needed&lt;/strong&gt;. To automatically send a key to a confirmation, place it on the pipeline. And to resolve the syntax issue, submit arguments to &lt;strong&gt;CACLS&lt;/strong&gt; as a string so PowerShell won&amp;#39;t get confused:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="keyword"&gt;&lt;span style="color:#0000ff;"&gt;
&lt;div class="pscode"&gt;&lt;span class="keyword"&gt;function&lt;/span&gt; &lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Create-Folder&lt;/span&gt;&lt;/span&gt; {&lt;br /&gt;&lt;span class="keyword"&gt;param&lt;/span&gt;(&lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt;, &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$user&lt;/span&gt;&lt;/span&gt;) &lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;if&lt;/span&gt; ( (&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Test-Path&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt;) &lt;span class="op"&gt;&lt;span style="color:#ff0000;"&gt;-ne&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$true&lt;/span&gt;&lt;/span&gt;) {&lt;br /&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;New-Item&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-Path&lt;/span&gt;&lt;/span&gt; &lt;span class="var"&gt;&lt;span style="color:#800080;"&gt;$path&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-ItemType&lt;/span&gt;&lt;/span&gt; Directory | &lt;span style="color:#5f9ea0;"&gt;&lt;span class="verbnoun"&gt;Out-Null&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;#39;y&amp;#39;&lt;/span&gt;&lt;/span&gt; | CACLS &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&amp;quot;&amp;quot;$path&amp;quot;&amp;quot; /G &amp;quot;&amp;quot;Domain Admins&amp;quot;&amp;quot;:R&amp;quot;&lt;/span&gt;&lt;/span&gt; | &lt;span style="color:#5f9ea0;"&gt;&lt;span class="verbnoun"&gt;Out-Null&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;CACLS &lt;span class="string"&gt;&lt;span style="color:#800000;"&gt;&amp;quot;&amp;quot;&amp;quot;$path&amp;quot;&amp;quot; /E /G &amp;quot;&amp;quot;$user&amp;quot;&amp;quot;:F&amp;quot;&lt;/span&gt;&lt;/span&gt; | &lt;span style="color:#5f9ea0;"&gt;&lt;span class="verbnoun"&gt;Out-Null&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;}&lt;/div&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;p&gt;Now it is easy to create new folders and apply standard NTFS security:&lt;/p&gt;
&lt;div class="pscode"&gt;&lt;span class="verbnoun"&gt;&lt;span style="color:#5f9ea0;"&gt;Create-Folder&lt;/span&gt;&lt;/span&gt; &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-path&lt;/span&gt;&lt;/span&gt; c:\user1 &lt;span class="modifier"&gt;&lt;span style="color:#5f9ea0;"&gt;-user&lt;/span&gt;&lt;/span&gt; mydomain\username&lt;/div&gt;
&lt;h3&gt;Careful!&lt;/h3&gt;
&lt;p&gt;Unfortunately, this &lt;strong&gt;approach is not culture-neutral&lt;/strong&gt;. On non-US systems, you probably will want to change two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Make sure you &lt;strong&gt;use the correct name for the Admin group&lt;/strong&gt;. On German systems, it is called &amp;quot;Dom&amp;auml;nen-Admins&amp;quot; instead of &amp;quot;Domain Admins&amp;quot;&lt;/li&gt;
&lt;li&gt;Make sure you &lt;strong&gt;send the correct confirmation key&lt;/strong&gt;. On German systems, it is &amp;quot;J&amp;quot; rather than &amp;quot;Y&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I know that sucks, but for a number of scenarios, incorporating tools like &lt;strong&gt;CACLS&lt;/strong&gt; can simplify life tremendously. Learning points here are: console-based applications are (almost) equal PowerShell citizens. To submit arguments to them, you may have to turn them into a string in order to avoid parsing conflicts.&lt;/p&gt;
&lt;p&gt;See you next time!&lt;/p&gt;
&lt;p&gt;Tobias&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Microsoft MVP PowerShell Germany&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;P.S.&lt;br /&gt;If you live in Germany or other parts of Europe and your company would like to set up a truly great PowerShell training, just contact me! I regularly train mid- to large-size companies. Trainings are always a blast with tons of real-world-examples and solutions. Here&amp;#39;s how to get in touch with me: &lt;a href="mailto:tobias.weltner@scriptinternals.de"&gt;&lt;span style="color:#3366cc;"&gt;tobias.weltner@scriptinternals.de&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://powershell.com/cs/aggbug.aspx?PostID=12433" width="1" height="1"&gt;</description><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/Folder/default.aspx">Folder</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/NTFS/default.aspx">NTFS</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/get-acl/default.aspx">get-acl</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/set-acl/default.aspx">set-acl</category><category domain="http://powershell.com/cs/blogs/tobias/archive/tags/cacls/default.aspx">cacls</category></item></channel></rss>