Установка баз данных App-V и преобразование соответствующих идентификаторов безопасности с помощью PowerShell

Обновлено: Ноябрь 2012 г.

Назначение: Application Virtualization 5.0, Application Virtualization 5.0 SP1, Application Virtualization 5.0 SP2, Application Virtualization 5.0 SP3

Следующая процедура PowerShell используется для преобразования любого количества пользовательских или машинных учетных записей доменных служб Active Directory (AD DS) в форматированные идентификаторы безопасности (SID) как в стандартном, так и в шестнадцатеричном формате, используемые Microsoft SQL Server при выполнении скриптов SQL.

Прежде чем пытаться выполнить эту процедуру, следует прочитать и понять сведения и примеры, которые приведены в следующем списке.

  • .INPUTS — учетная запись (или учетные записи) для преобразования в формат SID. Это может быть одна учетная запись или массив учетных записей.

  • .OUTPUTS — список имен учетных записей с соответствующими SID в стандартном и шестнадцатеричном формате.

  • Примеры:



    .\ConvertToSID.ps1 DOMAIN\user_account1 DOMAIN\machine_account1$ DOMAIN\user_account2 | Format-List.



    $accountsArray = @("DOMAIN\user_account1", "DOMAIN\machine_account1$", "DOMAIN_user_account2")

    .\ConvertToSID.ps1 $accountsArray | Write-Output -FilePath .\SIDs.txt -Width 200



    #>

Преобразование любого количества пользовательских или машинных учетных записей в доменных службах Active Directory (AD DS) в форматированные идентификаторы безопасности (SID)

  1. Скопируйте следующий скрипт в текстовый редактор и сохраните его как файл скрипта PowerShell, например, ConvertToSIDs.ps1.

  2. Чтобы открыть консоль PowerShell, нажмите кнопку Пуск и введите PowerShell. Щелкните правой кнопкой мыши пункт Windows PowerShell и выберите пункт Запуск от имени администратора.

    This PowerShell script will take an array of account names and try to convert each of them to the corresponding SID in standard and hexadecimal formats.
    
    .DESCRIPTION
    
    This is a PowerShell script that converts any number of Active Directory (AD) user or machine accounts into formatted Security Identifiers (SIDs) both in the standard format and in the hexadecimal format used by SQL server when running SQL scripts.
    
    The account(s) to convert to SID format. This can be a single account name or an array of account names. Please see examples below.
    
    A list of account names with the corresponding SID in standard and hexadecimal formats
    
    .\ConvertToSID.ps1 DOMAIN\user_account1 DOMAIN\machine_account1$ DOMAIN\user_account2 | Format-List
    
    $accountsArray = @("DOMAIN\user_account1", "DOMAIN\machine_account1$", "DOMAIN_user_account2")
    
    .\ConvertToSID.ps1 $accountsArray | Write-Output -FilePath .\SIDs.txt -Width 200
    

    function ConvertSIDToHexFormat
    

    {

       param([System.Security.Principal.SecurityIdentifier]$sidToConvert)

       $sb = New-Object System.Text.StringBuilder
    

        [int] $binLength = $sidToConvert.BinaryLength
    

        [Byte[]] $byteArray = New-Object Byte[] $binLength
    

       $sidToConvert.GetBinaryForm($byteArray, 0)
    

       foreach($byte in $byteArray)
    

       $sb.Append($byte.ToString("X2")) |Out-Null
    

       return $sb.ToString()
    

     [string[]]$myArgs = $args
    

    if(($myArgs.Length -lt 1) -or ($myArgs[0].CompareTo("/?") -eq 0))
    

    {

     [string]::Format("{0}====== Description ======{0}{0}" +
    

    "  Converts any number of user or machine account names to string and hexadecimal SIDs.{0}" +
    
    
                   "  Pass the account(s) as space separated command line parameters. (For example 'ConvertToSID.exe DOMAIN\\Account1 DOMAIN\\Account2 ...'){0}" +
    
    
    
                   "  The output is written to the console in the format 'Account name    SID as string   SID as hexadecimal'{0}" +
    
    
    
                   "  And can be written out to a file using standard PowerShell redirection{0}" +
    
    
    
                   "  Please specify user accounts in the format 'DOMAIN\username'{0}" + 
    
    
    
                   "  Please specify machine accounts in the format 'DOMAIN\machinename$'{0}" +
    
    
    
                   "  For more help content, please run 'Get-Help ConvertToSID.ps1'{0}" + 
    
    
    
                   "{0}====== Arguments ======{0}" +
    
    
    
                   "{0}  /?    Show this help message", [Environment]::NewLine) 
    

    
    {  
        #If an array was passed in, try to split it
    
    
    
        if($myArgs.Length -eq 1)
    
    
    
            $myArgs = $myArgs.Split(' ')
    
    
    
    
        #Parse the arguments for account names
    
    
    
        foreach($accountName in $myArgs)
    
    
    
        {    
    
    
    
            [string[]] $splitString = $accountName.Split('\')  # We're looking for the format "DOMAIN\Account" so anything that does not match, we reject
    
    
    
            if($splitString.Length -ne 2)
    
    
    
            {
    
    
    
                $message = [string]::Format("{0} is not a valid account name. Expected format 'Domain\username' for user accounts or 'DOMAIN\machinename$' for machine accounts.", $accountName)
    
    
    
                Write-Error -Message $message
    
    
    
                continue
    
    
    
            }
    
    
    
            
    
    
    
            #Convert any account names to SIDs
    
    
    
            try
    
    
    
            {
    
    
    
                [System.Security.Principal.NTAccount] $account = New-Object System.Security.Principal.NTAccount($splitString[0], $splitString[1])
    
    
    
                [System.Security.Principal.SecurityIdentifier] $SID = [System.Security.Principal.SecurityIdentifier]($account.Translate([System.Security.Principal.SecurityIdentifier]))
    
    
    
            }
    
    
    
            catch [System.Security.Principal.IdentityNotMappedException]
    
    
    
            {
    
    
    
                $message = [string]::Format("Failed to translate account object '{0}' to a SID. Please verify that this is a valid user or machine account.", $account.ToString())
    

    
                Write-Error -Message $message
    
    
    
                continue
    
    
    
            }
    
    
    
    
            #Convert regular SID to binary format used by SQL
    
    
    
            $hexSIDString = ConvertSIDToHexFormat $SID
    
    
    
            
            $SIDs = New-Object PSObject
    
    
    
            $SIDs | Add-Member NoteProperty Account $accountName
    
    
    
            $SIDs | Add-Member NoteProperty SID $SID.ToString()
    
    
    
            $SIDs | Add-Member NoteProperty Hexadecimal $hexSIDString
    
    
    
    
            Write-Output $SIDs
    
    

  3. Запустите скрипт, сохраненный на первом шаге этой процедуры, передавая преобразуемые учетные записи в качестве аргументов.

    Например,

    .\ConvertToSID.ps1 DOMAIN\user_account1 DOMAIN\machine_account1$ DOMAIN\user_account2 | Format-List” or “$accountsArray = @("DOMAIN\user_account1", "DOMAIN\machine_account1$", "DOMAIN_user_account2")

    .\ConvertToSID.ps1 $accountsArray | Write-Output -FilePath .\SIDs.txt -Width 200”



    Есть предложение для App-V? Выдвигайте предложения и голосуйте за них здесь.
    Есть вопрос по App-V? Найдите ответ на форуме TechNet по App-V.

См. также

-----
Дополнительные сведения о MDOP можно найти в библиотеке TechNet, статьях по устранению неполадок на вики-сайте TechNet или подписавшись на новости в Facebook или Twitter.
-----
Показ: