Как запустить скрипт powershell, который использует как локальные, так и повышенные разрешения? - PullRequest
0 голосов
/ 27 февраля 2020

Мне нужно отредактировать два ключа реестра. Один должен запускаться локальным пользователем, другой - учетной записью с повышенными привилегиями.

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

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Как администратор, вы также можете установить значение реестра для текущего пользователя, вошедшего в систему, если вы можете получить SID для этого пользователя. Когда у вас это есть, вы можете получить доступ к реестру локальных пользователей через HKEY_USERS куст.

Import-Module ActiveDirectory

# set this to the registry path, property name and value you need to access
$regPath   = 'Software\SomePath\SomeKey'
$propName  = 'ThePropertyName'
$propValue = 'ThePropertyValue'
$propType  = 'String'           # use any of the `[Microsoft.Win32.RegistryValueKind]` enum values or names

# get the domain\username of the user currently logged in to the computer
$user = (Get-CimInstance -ClassName Win32_ComputerSystem).UserName
# get the SID for that user 
$sid = (Get-ADUser -Identity ($user -split '\\', 2)[0]).SID
if (!$sid) {
    throw "Could not determine the SID for user '$user'"
}

# Admin registry: HKEY_LOCAL_MACHINE
$path = Join-Path -Path 'HKLM:' -ChildPath $regPath
Set-Itemproperty -Path $path -Name $propName -Value $propValue -Type $propType

# Current user registry: HKEY_USERS
$path = Join-Path -Path "Registry::HKEY_USERS\$sid" -ChildPath $regPath
Set-Itemproperty -Path $path -Name $propName -Value $propValue -Type $propType

Как прокомментировал mklement0 , в приведенном выше коде используется модуль ActiveDirectory чтобы получить SID для текущего пользователя, вошедшего в систему через Get-ADUser.
Если это невозможно для вас или вы не находитесь в домене AD, следующая вспомогательная функция также может получить SID без необходимости ActiveDirectory :

function Get-UserSID {
    param (
        [Parameter(ValuefromPipeline = $true, Position = 0)]
        [Alias('Account', 'User')]
        [string]$UserName = $env:USERNAME,
        [string]$Domain   = $env:USERDOMAIN
    )
    if ($UserName.Contains("\")) { $Domain, $UserName = $UserName -split '\\', 2 }   #"# split on the backslash
    try {
        $objUser = New-Object System.Security.Principal.NTAccount($Domain, $UserName)
        $strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])
        $strSID.Value
    }
    catch [System.Security.Principal.IdentityNotMappedException] {
        Write-Warning "User '$UserName' does not exist in '$Domain'"
    }
    catch {
        throw
    }
}

Поместите это поверх вашего скрипта и затем используйте как:

# get the domain\username of the user currently logged in to the computer
$user = (Get-CimInstance -ClassName Win32_ComputerSystem).UserName
# get the SID for that user 
$sid = Get-UserSID $user

Возможный третий способ получения SID - чтение реестра:

# get the domain\username of the user currently logged in to the computer
$user = (Get-CimInstance -ClassName Win32_ComputerSystem).UserName
# get the SID for that user by probing the registry
$sid = ((Get-ItemProperty -Path 'Registry::HKEY_USERS\S-*\Volatile Environment' |
         Where-Object { ('{0}\{1}' -f $_.USERDOMAIN, $_.USERNAME) -eq $user }).PSParentPath -split '\\')[-1]
0 голосов
/ 27 февраля 2020

Вы можете использовать ключ "-credential" для установки пользователя, который будет изменять реестр, например:

New-Item –Path "HKCU:\dummy" –Name newregistrykey -Credential myuser@domain

или для установки свойства:

Set-Itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run' -Name 'someProcess' -value 'C:\Program Files\someapp\myprogramm.exe' -Credential myuser@domain

И вы можете сохранить оба кредит на переменные, такие как:

$localCred = Get-Credential
$domainCred = Get-Credential
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...