96

On my Windows 7 Desktop, I have script.ps1, which needs admin privileges (it starts a service). I want to click on this script and run it with admin privileges.

What's the easiest way to accomplish this?

0

10 Answers 10

80

Here is one way of doing it, with the help of an additional icon on your desktop. I guess you could move the script someone else if you wanted to only have a single icon on your desktop.

  1. Create a shortcut to your Powershell script on your desktop
  2. Right-click the shortcut and click Properties
  3. Click the Shortcut tab
  4. Click Advanced
  5. Select Run as Administrator

You can now run the script elevated by simple double-clicking the new shortcut on your desktop.

6
  • 80
    This worked for me, but Run as Administrator only became available after adding powershell -f in front of the script path, so as to "complete" the command…
    – mousio
    Nov 1, 2012 at 22:40
  • 2
    @mousio - I needed this too, thanks for the comment Mar 18, 2013 at 17:15
  • 3
    @mousio can you tell me why that command works?
    – SShaheen
    Aug 22, 2014 at 12:54
  • 23
    @SShaheen - for Run as Administrator to become available, the shortcut needs to point to some sort of executable (e.g. powershell.exe) instead of just the document or script the shortcut originally pointed to. A shortcut to script.ps1 works, as does a shortcut to powershell.exe -f script.ps1, but the latter can be set to run as administrator (see powershell.exe /? for the explanation of the -f or -File switch)
    – mousio
    Aug 22, 2014 at 13:30
  • I use it to start the powershell console as administrator. A similar result is to create a ps1 file with Start-Process powershell.exe -Verb RunAs.
    – Timo
    Oct 29, 2020 at 6:30
45

On UAC-enabled systems, to make sure a script is running with full admin privileges, add this code at the beginning of your script:

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
}

'running with full privileges'

Now, when running your script, it will call itself again and attempt to elevate privileges before running. The -elevated switch prevents it from repeating if something fails.

You may remove the -noexit switch if the terminal should automatically close when the script finishes.

7
  • If script requires arguments-parameters ?
    – Kiquenet
    Aug 29, 2014 at 13:50
  • 1
    what if this tells me it is running with full privileges, but my code still says insufficient administrative privileges?
    – mike.b93
    Mar 24, 2017 at 18:12
  • 1
    @Kiquenet add it into the param(...) on top and forward them right before -elevated, you'll need to be clever about how you build the ArgumentList, probably will want to use the String[] form.
    – TWiStErRob
    Jan 11, 2019 at 21:47
  • 2
    pretty nifty - better than creating a shortcut
    – Mikey
    Feb 6, 2019 at 20:01
  • Thank you SO much, this has saved me! Little caveat: The "-noexit" flag may be nice for debugging, but perhaps undesired behavior in production...
    – xeruf
    Oct 18, 2020 at 21:03
18

if you are in the same powershell you could do this:

Start-Process powershell -verb runas -ArgumentList "-file fullpathofthescript"
1
  • 1
    The problem with this is that it changes the working directory for the called script to C:\Windows\System32. An alternative which preserves the current directory: stackoverflow.com/a/57033941/2441655
    – Venryx
    Jul 15, 2019 at 6:35
4

Since it's sitting onto your desktop, I'd say the most effortless way to get this done is dragging it onto the elevation gadget.

Otherwise you could make a separate script using the elevate command on your ps1 script.

Or, you could apply elevate just to the service-starting bit.

1
  • 1
    please share some sample one liner code :)
    – Vino
    Sep 17, 2021 at 6:32
2

In addition to MDMoore313's answer above:

If we want to execute the commands in the same working directory as we are currently in, we have to add a few things:

#### START ELEVATE TO ADMIN #####
param(
    [Parameter(Mandatory=$false)]
    [switch]$shouldAssumeToBeElevated,

    [Parameter(Mandatory=$false)]
    [String]$workingDirOverride
)

# If parameter is not set, we are propably in non-admin execution. We set it to the current working directory so that
#  the working directory of the elevated execution of this script is the current working directory
if(-not($PSBoundParameters.ContainsKey('workingDirOverride')))
{
    $workingDirOverride = (Get-Location).Path
}

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

# If we are in a non-admin execution. Execute this script as admin
if ((Test-Admin) -eq $false)  {
    if ($shouldAssumeToBeElevated) {
        Write-Output "Elevating did not work :("

    } else {
        #                                                         vvvvv add `-noexit` here for better debugging vvvvv 
        Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -file "{0}" -shouldAssumeToBeElevated -workingDirOverride "{1}"' -f ($myinvocation.MyCommand.Definition, "$workingDirOverride"))
    }
    exit
}

Set-Location "$workingDirOverride"
##### END ELEVATE TO ADMIN #####

# Add actual commands to be executed in elevated mode here:
Write-Output "I get executed in an admin PowerShell"
1

PowerShell ISE lives at %windir%\system32\WindowsPowerShell\v1.0\PowerShell_ISE.exe. You can right-click that and select "Run as administrator" and run the script from in there.

You can also find it under the Windows Logo > All Programs > Accessories > Windows PowerShell and do the same thing with those shortcuts.

0

If you want an option to launch a Powershell script as adminstrator, directly from the Explorer context-menu, see section 2 of my answer here: https://stackoverflow.com/a/57033941/2441655

0
sudo

Why does it have to take 30+ lines of code to do what 4 characters do?

So here, write a .bat file to invoke your script, in it use the:

Start-Process powershell.exe -Verb RunAs
-1

Add this to the beginning of the script:

$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
$testadmin = $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
if ($testadmin -eq $false) {
Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
exit $LASTEXITCODE
}
1
-1

I found this detailed solution explaining how to add the option to the context menu.

Solution

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.