W systemie Windows użytkownicy mogą mieć uprawnienia (do plików, drukarek itp) oraz prawa (do wyłączenia komputera, do zalogowania itp). Tutaj przedstawiam dwie funkcje, które pracują z prawami użytkowników. Pierwsza z nich sprawdza, czy użytkownik ma przyznane prawo, a druga nadaje takie prawo.
Filozofia obu funkcji jest podobna. Polecenie secedit służy do wyeksportowania informacji o przyznanych prawach dla użytkowników oraz do zaimportowania tych informacji. Między eksportem a importem znajduje się trochę typowej PowerShellowej logiki, która sprawdza czy użytkownik ma przypisane prawo czy nie.
Oto i funkcje:
<#
.SYNOPSIS
Tests is a user has right
.DESCRIPTION
secedit is used
if error appears it is thrown
if user has the right returns $true
if user does not have the right or error happens returns $false
.EXAMPLE
Test-UserRight -account rafal -userRight "SeServiceLogonRight"
True
.EXAMPLE
Test-UserRight -account rafal -userRight "SeServiceLogonRight_NON_EXISTING"
Test-UserRight : Right not found: SeServiceLogonRight_NON_EXISTING
False
.EXAMPLE
Test-UserRight -account rafal_NONEXISTING -userRight "SeServiceLogonRight"
False
.EXAMPLE
Test-UserRight -account patryk -userRight "SeServiceLogonRight"
False
#>
function Test-UserRight
{
[CmdletBinding()]
Param(
[Parameter(mandatory=$true)]
$account,
[Parameter(mandatory=$true)]
$userRight
)
#export data to temporal file
$tempFile = [System.IO.Path]::GetTempFileName()
$retCode = Start-Process secedit -ArgumentList "/export /areas USER_RIGHTS /cfg $tempFile" -Wait -PassThru
if ($retCode.ExitCode -ne 0)
{
Write-Error "Getting user rights failed with code $($retCode.ExitCode)"
del $tempFile -ea SilentlyContinue
return $false
}
#extract list of users with user right
$line = Get-Content $tempFile -Encoding Unicode | where {$_ -like "$userRight*"} | select -First 1
if ($line -eq $null)
{
Write-Error "Right not found: $userRight"
del $tempFile -EA SilentlyContinue
return $false
}
$lineTable = @()
$lineTable += $line.split('=')
$users = @()
$users += $lineTable[1].split(',') | foreach { $_.Trim() }
del $tempFile -ea SilentlyContinue
#test if the user has the right and return value
return ($account -in $users)
}
<#
.SYNOPSIS
Adds a user right to a user
.DESCRIPTION
secedit is used
if error appears it is thrown
if success returns 0
if failure returns value <> 0
.EXAMPLE
Add-UserRight -account rafal -userRight SeServiceLogonRight
User rafal has been assigned SeServiceLogonRight
0
.EXAMPLE
Add-UserRight -account rafal -userRight SeLockMemory
User rafal already has SeLockMemory. No action required
0
.EXAMPLE
Add-UserRight -account rafal -userRight SeLockMemory_NOT_EXISTING
Add-UserRight : Right not found: SeLockMemory_NOT_EXISTING
-1
.EXAMPLE
Add-UserRight -account rafal_NOT_EXISTING -userRight SeServiceLogonRight
Add-UserRight : security template export failed exit code 1. Wrong username (rafal_NOT_EXISTING)?
1
#>
function Add-UserRight
{
[CmdletBinding()]
Param(
[Parameter(mandatory=$true)]
$account,
[Parameter(mandatory=$true)]
$userRight
)
#export data to temporal file
$tempFile = [System.IO.Path]::GetTempFileName()
$retCode = Start-Process secedit -ArgumentList "/export /areas USER_RIGHTS /cfg $tempFile" -Wait -PassThru
if ($retCode.ExitCode -ne 0)
{
Write-Error "Getting user rights failed with code $($retCode.ExitCode)"
del $tempFile -ea SilentlyContinue
return -1
}
#extract list of users with user right
$line = Get-Content $tempFile -Encoding Unicode | where {$_ -like "$userRight*"} | select -First 1
if ($line -eq $null)
{
Write-Error "Right not found: $userRight"
del $tempFile -EA SilentlyContinue
return -1
}
$lineTable = @()
$lineTable += $line.split('=')
$users = @()
$users += $lineTable[1].split(',') | foreach { $_.Trim() }
#if needed - add the right to the user
if ( -not ($account -in $users))
{
$users += $account
$lineTable[1] = $users -join ','
$newLine = $lineTable -join '='
$content = (Get-Content $tempFile -Encoding Unicode).Replace($line,$newLine)
$content | Out-File $tempFile -Force -Encoding unicode
$retCode = Start-Process secedit -ArgumentList "/configure /db secedit.sdb /cfg $tempFile /areas USER_RIGHTS" -Wait -PassThru
if ($retCode.ExitCode -ne 0)
{
Write-Error "security template export failed exit code $($retCode.ExitCode). Wrong username ($account)?"
del $tempFile -ea SilentlyContinue
return $retCode.ExitCode
}
else
{
Write-Output "User $account has been assigned $userRight"
}
}
else
{
echo "User $account already has $userRight. No action required"
}
del $tempFile -ea SilentlyContinue
return 0
}





























