Назад | Перейти на главную страницу

Как я могу получить текущее подразделение с помощью сценария входа в PowerShell?

Я настраиваю 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 и даже не любитель в этом отношении, но, вероятно, я бы начал с этого.

Извините, я ничем не могу больше помочь, надеюсь, это повод для размышлений.