Я настраиваю Terminal Server 2008, который будет использоваться разными клиентскими организациями, каждая из которых имеет несколько индивидуальных учетных записей пользователей. Я бы хотел, чтобы у каждой клиентской организации был диск, подключенный к \ server \ clients \
Их имя OU также является именем их клиента, поэтому я хотел бы иметь возможность найти их текущее OU, а затем использовать его для команды сопоставления. Подразделения являются иерархическими, поэтому это самое нижнее имя подразделения, которое мне нужно.
пример
ОУ:
Выделенные клиенты \ AjaxCorp
Должен быть подключен диск к
\\ server1 \ share \ AjaxCorp
Есть предложения, как я могу получить OU? Я уверен, что это должно быть легко, просто я не понял ...
Я нашел информацию о том, как это сделать с помощью сценария VB, но поскольку это совершенно новая среда, я подумал, что было бы неплохо использовать вместо нее PowerShell.
Это даст вам путь LDAP к текущему компьютеру:
$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$strFilter = "(&(objectCategory=computer)(name=" + $env:computername + "))"
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.Filter = $strFilter
$strPath = $objSearcher.FindOne().Path
Из результата в $ strPath вы сможете построить сетевой путь к нужному общему ресурсу.
Чтобы фактически вернуть объект типа Microsoft.ActiveDirectory.Management.ADOrganizationalUnit пользовательского объекта, используйте это:
Get-ADOrganizationalUnit -Identity $(($adUser = Get-ADUser -Identity $env:USERNAME).DistinguishedName.SubString($adUser.DistinguishedName.IndexOf("OU=")))
То же самое можно сделать и с компьютером:
Get-ADOrganizationalUnit -Identity $(($adComputer = Get-ADComputer -Identity $env:COMPUTERNAME).DistinguishedName.SubString($adComputer.DistinguishedName.IndexOf("OU=")))
В конце концов я понял, как получить OU из http://www.microsoft.com/technet/scriptcenter/resources/pstips/dec07/pstip1207.mspx и думал, что поделюсь результатами. Код для получения OU следующий:
$strName = $env:username
$strFilter = "(&(objectCategory=User)(samAccountName=$strName))"
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.Filter = $strFilter
$objPath = $objSearcher.FindOne()
$objUser = $objPath.GetDirectoryEntry()
$objUser.memberOf
Однако затем я понял, что использование OU будет сопряжено с трудностями, поскольку пользователь может быть членом нескольких OU. Поэтому я решил использовать поле «Компания» в объекте «Пользователь». Из того же кода выше я могу сделать
$strCompany = $objUser.Company
А затем составьте карту дисков.
Это отвечает на мой первоначальный вопрос, но просто для интереса я должен упомянуть, что в конце концов я решил не использовать PowerShell для сценария входа: это слишком болезненно для развертывания; Вы не можете просто поместить файл .ps1 в групповую политику, вы должны явно вызвать Powershell.exe из файла cmd. Итак, я переписал свой скрипт на vbscript за несколько минут и пожалел, что не начал с этого :)
Однако затем я понял, что использование OU будет сопряжено с трудностями, поскольку пользователь может быть членом нескольких OU.
Нет, не может. По определению, учетная запись пользователя может находиться только в одном месте AD. Однако разные пользователи могут иметь одно и то же RDN.
Я использовал это, чтобы получить
$ hostname = имя хоста
$ hostnameobject = get-adcomputer $ имя хоста
$ ou = $ hostnameobject.distinguishedname
Найдите DN пользователя и проанализируйте его.
Я не эксперт по Powershell и даже не любитель в этом отношении, но, вероятно, я бы начал с этого.
Извините, я ничем не могу больше помочь, надеюсь, это повод для размышлений.