问题描述
Unix命令示例,powershell上的等效命令是什么?
if [ "$UID" -ne 0 ]
then echo "Please run as root"
exit
fi
解决方法
如果您在Linux上运行Powershell,则可以编写如下内容:
if ((id -u) -ne 0) {
write-host "Please run as root"
exit
}
如果在Windows上使用Powershell,请使用语句requires。这样,仅当用户是管理员时,脚本才会运行。示例:
#Requires -RunAsAdministrator
write-host "This is an administrator"
,
您说您想要一个等效的Unix命令,但您的问题尚不清楚您需要在哪个平台上使用该等效命令。如果您需要Windows答案,那就非常接近了:
$windowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$windowsSecurityPrincipal = [System.Security.Principal.WindowsPrincipal]::new($windowsID)
$adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator
if ( -not $windowsSecurityPrincipal.IsInRole($adminRole)) {
Write-Host "Please run as an administrator."
exit
}
过去,我有一些像这样的自提升脚本:
# ##########################################
# Determine if we have Administrator rights
Write-Host 'Checking user permissions... '
$windowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$windowsSecurityPrincipal = New-Object System.Security.Principal.WindowsPrincipal($windowsID)
$adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator
If (!($windowsSecurityPrincipal.IsInRole($adminRole))) {
Write-Warning 'Current user does not have Administrator rights'
Write-Host 'Attempting to copy files to temporary location and restarting script'
# Get random file name
Do {
$temp = [System.IO.Path]::GetTempPath() + [System.IO.Path]::GetRandomFileName()
} Until (!(Test-Path -LiteralPath "$temp"))
# Create directory
Write-Host 'Creating temp directory... ' -NoNewLine
New-Item -Path "$temp" -ItemType 'Directory' | Out-Null
Write-Host 'done.'
# Copy script to directory
Write-Host 'Copying script to temp directory... ' -NoNewLine
Copy-Item -LiteralPath "$($myInvocation.MyCommand.Path)" "$temp" | Out-Null
Write-Host 'done.'
$newScript = "$($temp)\$($myInvocation.MyCommand.Name)"
# Start new script elevated
Write-Host 'Starting script as administrator... ' -NoNewLine
$adminProcess = New-Object System.Diagnostics.ProcessStartInfo
$adminProcess.Filename = ([System.Diagnostics.Process]::GetCurrentProcess()).Path
$adminProcess.Arguments = " -File `"$newScript`""
$adminProcess.Verb = 'runas'
Try {
[System.Diagnostics.Process]::Start($adminProcess) | Out-Null
}
Catch {
Write-Error 'Could not start process'
Exit 1
}
Write-Host 'done.'
Exit 0
}
# Begin script code here
该代码已经很旧了。我想我是为Powershell 2或3编写的。尽管它不再是最漂亮的代码了,它仍然应该可以工作。