使用提升的权限创建基于PowerShell的简单安装程序

时间:2014-09-06 23:25:24

标签: powershell

我正在尝试创建一个执行大量安装操作的脚本,包括执行其他文件,例如.reg文件来更新注册表。我创建了一个批处理文件来启动它,并在powershell脚本中有代码以自我提升以管理员身份运行。问题是,一旦以管理员身份运行,工作路径就是C:\ Windows \ system32,之后脚本无法归档到需要运行的其他(相对)文件。

INSTALL.BAT:

powershell InstallSteps.ps1

InstallSteps.ps1:

param([switch]$Elevated)

function Test-Admin {
  $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
  $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}

if ((Test-Admin) -eq $false)  {
    if ($elevated) 
    {
        # tried to elevate, did not work, aborting
    } 
    else {
        Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
    }

    exit
}

# THIS SHOWS THE PATH IS "C:\WINDOWS\SYSTEM32"
Write-Host $pwd

# THIS FAILS, BECAUSE IT CAN'T FIND THE FILE
reg IMPORT EnableAllTrustedApps.reg

我还没有找到一种方法来传递这些相对路径进入工作路径。它似乎是" Start-Process"提升方法会丢失脚本最初所在位置的所有上下文。

1 个答案:

答案 0 :(得分:2)

我建议始终使用此功能来调用外部事物。它比相对路径更可靠。

function Get-Script-Directory
{
    $scriptInvocation = (Get-Variable MyInvocation -Scope 1).Value
    return Split-Path $scriptInvocation.MyCommand.Path
}

e.g。

$script_home = Get-Script-Directory
reg.exe IMPORT "$script_home\EnableAllTrustedApps.reg"

注意 - 在3.0或更高版本中,您可以使用此新的内置变量而不是函数。

$PSScriptRoot

您可能还想尝试为-WorkingDirectory指定Start-Process参数,例如Start-Process -FilePath powershell.exe -verb RunAs -WorkingDirectory $PWD.Path