{"id":164,"date":"2011-07-03T16:42:13","date_gmt":"2011-07-03T22:42:13","guid":{"rendered":"http:\/\/ryan.witschger.net\/?p=164"},"modified":"2011-07-03T16:42:13","modified_gmt":"2011-07-03T22:42:13","slug":"ad-without-quest-getting-and-using-adspath","status":"publish","type":"post","link":"http:\/\/www.Get-Blog.com\/?p=164","title":{"rendered":"AD without Quest: Getting and Using ADSPath"},"content":{"rendered":"<p>This is the second post in my AD without Quest series.  I am covering individual functions that can be combine to produce a wide variety of scripts.  Today I am going to be covering how to connect to AD to read an object ADSPath.  The ADSPath is basically the LDAP string to connect to that object.  Once you have an object\u2019s LDAP path it is very easy to work with the object.<\/p>\n<p>When searching in AD all you need to do is use the directory searcher object and continue to narrow down the filter.  There are some slight changes between searching for a user, computer and group, so I\u2019ll cover each.<\/p>\n<div class=\"codecolorer-container powershell solarized-dark\" style=\"overflow:auto;white-space:nowrap;width:680px;\"><div class=\"powershell codecolorer\">&nbsp;<span class=\"kw3\">Function<\/span> Get<span class=\"sy0\">-<\/span>UserADSPathbyName<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">Param<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span><span class=\"re3\">STRING<\/span><span class=\"br0\">&#93;<\/span><span class=\"re0\">$User<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"re0\">$Searcher<\/span><span class=\"sy0\">=<\/span><span class=\"kw1\">New-Object<\/span> System.DirectoryServices.DirectorySearcher<br \/>\n&nbsp; &nbsp; <span class=\"re0\">$Searcher<\/span>.<span class=\"kw3\">Filter<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;(&amp;(SamAccountName=$User)(objectcategory=user))&quot;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$Searcher<\/span>.PageSize <span class=\"sy0\">=<\/span> <span class=\"nu0\">1000<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$Results<\/span><span class=\"sy0\">=<\/span><span class=\"re0\">$Searcher<\/span>.FindAll<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">If<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">!<\/span><span class=\"re6\">$?<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><span class=\"st0\">&quot;AD searcher failed on $User&quot;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw3\">If<\/span> <span class=\"br0\">&#40;<\/span><span class=\"re0\">$Results<\/span>.Count <span class=\"kw4\">-eq<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$Results<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span>.properties.adspath<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"kw3\">Else<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">Return<\/span> <span class=\"re0\">$false<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>On the line with <code class=\"codecolorer powershell default\"><span class=\"powershell\"><span class=\"re0\">$Results<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span>.properties.adspath<\/span><\/code> it is important to note that the \u201cadspath\u201d portion is case sensitive.  I really have no clue why that is the case.  If you know, drop me a comment to help me out!<\/p>\n<div class=\"codecolorer-container powershell solarized-dark\" style=\"overflow:auto;white-space:nowrap;width:680px;\"><div class=\"powershell codecolorer\">&nbsp;<span class=\"kw3\">Function<\/span> Get<span class=\"sy0\">-<\/span>ComputerADSPathbyName<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">Param<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span><span class=\"re3\">STRING<\/span><span class=\"br0\">&#93;<\/span><span class=\"re0\">$Computer<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"re0\">$Searcher<\/span><span class=\"sy0\">=<\/span><span class=\"kw1\">New-Object<\/span> System.DirectoryServices.DirectorySearcher<br \/>\n&nbsp; &nbsp; <span class=\"re0\">$Searcher<\/span>.<span class=\"kw3\">Filter<\/span><span class=\"sy0\">=<\/span>\u201d<span class=\"br0\">&#40;<\/span><span class=\"sy0\">&amp;<\/span><span class=\"br0\">&#40;<\/span>CN<span class=\"sy0\">=<\/span><span class=\"re0\">$Computer<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#40;<\/span>objectcategory<span class=\"sy0\">=<\/span>computer<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span>\u201d<br \/>\n&nbsp; &nbsp; <span class=\"re0\">$Searcher<\/span>.PageSize <span class=\"sy0\">=<\/span> <span class=\"nu0\">1000<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$Results<\/span><span class=\"sy0\">=<\/span><span class=\"re0\">$Searcher<\/span>.FindAll<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">If<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">!<\/span><span class=\"re6\">$?<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><span class=\"st0\">&quot;AD searcher failed on $Computer&quot;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw3\">If<\/span> <span class=\"br0\">&#40;<\/span><span class=\"re0\">$Results<\/span>.Count <span class=\"kw4\">-eq<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$Results<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span>.properties.adspath<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"kw3\">Else<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">Return<\/span> <span class=\"re0\">$false<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>So as you can see, a couple of small changes will convert the function for use with computers instead of users.  One final function converts this again for use with groups.<\/p>\n<div class=\"codecolorer-container powershell solarized-dark\" style=\"overflow:auto;white-space:nowrap;width:680px;\"><div class=\"powershell codecolorer\">&nbsp;<span class=\"kw3\">Function<\/span> Get<span class=\"sy0\">-<\/span>GroupADSPathbyName<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">Param<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span><span class=\"re3\">STRING<\/span><span class=\"br0\">&#93;<\/span><span class=\"re0\">$Group<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; <span class=\"re0\">$Searcher<\/span><span class=\"sy0\">=<\/span><span class=\"kw1\">New-Object<\/span> System.DirectoryServices.DirectorySearcher<br \/>\n&nbsp; &nbsp; <span class=\"re0\">$Searcher<\/span>.<span class=\"kw3\">Filter<\/span><span class=\"sy0\">=<\/span>\u201d<span class=\"br0\">&#40;<\/span><span class=\"sy0\">&amp;<\/span><span class=\"br0\">&#40;<\/span>CN<span class=\"sy0\">=<\/span><span class=\"re0\">$Group<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#40;<\/span>objectcategory<span class=\"sy0\">=<\/span><span class=\"kw2\">group<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span>\u201d<br \/>\n&nbsp; &nbsp; <span class=\"re0\">$Searcher<\/span>.PageSize <span class=\"sy0\">=<\/span> <span class=\"nu0\">1000<\/span><br \/>\n&nbsp; &nbsp; <span class=\"re0\">$Results<\/span><span class=\"sy0\">=<\/span><span class=\"re0\">$Searcher<\/span>.FindAll<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">If<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">!<\/span><span class=\"re6\">$?<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><span class=\"st0\">&quot;AD searcher failed on $Group&quot;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw3\">If<\/span> <span class=\"br0\">&#40;<\/span><span class=\"re0\">$Results<\/span>.Count <span class=\"kw4\">-eq<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re0\">$Results<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span>.properties.adspath<br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"kw3\">Else<\/span><span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">Return<\/span> <span class=\"re0\">$false<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>So there they are, but what can you do with them?  There is a great variable type in PowerShell defined with the ADSI tag.  Once a LDAP string is defined as and ADSI variable you can interact directly with that object by reading any property you want, and even changing them.<\/p>\n<div class=\"codecolorer-container powershell solarized-dark\" style=\"overflow:auto;white-space:nowrap;width:680px;\"><div class=\"powershell codecolorer\"><span class=\"re0\">$UserLDAP<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span>ADSI<span class=\"br0\">&#93;<\/span>$<span class=\"br0\">&#40;<\/span>Get<span class=\"sy0\">-<\/span>UserADSPathbyName \u201cMyUserName\u201d<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"re0\">$UserLDAP<\/span>.extensionAttribute1<br \/>\n<span class=\"sy0\">&gt;<\/span>MyOldValue<br \/>\n<span class=\"re0\">$UserLDAP<\/span>.Put<span class=\"br0\">&#40;<\/span>\u201cextensionAttribute1\u201d<span class=\"sy0\">,<\/span>\u201dMyNewValue\u201d<span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"re0\">$UserLDAP<\/span>.SetInfo<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<span class=\"re0\">$UserLDAP<\/span>.extensionAttribute1<br \/>\n<span class=\"sy0\">&gt;<\/span>MyNewValue<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>This is the second post in my AD without Quest series. I am covering individual functions that can be combine to produce a wide variety of scripts. Today I am going to be covering how to connect to AD to read an object ADSPath. The ADSPath is basically the LDAP string to connect to that <a href='http:\/\/www.Get-Blog.com\/?p=164' class='excerpt-more'>[&#8230;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[6,4],"tags":[],"_links":{"self":[{"href":"http:\/\/www.Get-Blog.com\/index.php?rest_route=\/wp\/v2\/posts\/164"}],"collection":[{"href":"http:\/\/www.Get-Blog.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.Get-Blog.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.Get-Blog.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.Get-Blog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=164"}],"version-history":[{"count":0,"href":"http:\/\/www.Get-Blog.com\/index.php?rest_route=\/wp\/v2\/posts\/164\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.Get-Blog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=164"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.Get-Blog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=164"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.Get-Blog.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=164"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}