仅在选择RUN AS ADMIN时运行

时间:2013-12-05 10:21:12

标签: powershell-v2.0

我编辑了我找到的脚本,收集有关网络设备的容量管理,并且一切正常

想法是: 出于安全原因,我需要将Powershell脚本设置为.exe,这是没有问题我把它扔到Powergui并且一切都很好,应用程序(.exe)需要在用户使用时运行(右键单击 - 运行AS管理员)并且如果他只是双击它,exe必须给出某种错误,说应用程序无法在正常运行状态

上运行

它必须运行抛出RUN AS ADMIN,我想到了UAC,但这取决于机器,我需要它只依赖于exe,没有组策略没有UAC,任何想法?我想在C +中创建一个EXE,用特殊的环境运行它里面的脚本并找到它自己的过程给它许可,但我失败了,

如果需要,我也可以分享剧本

任何想法? :)

1 个答案:

答案 0 :(得分:0)

这两行将让您检测当前用户是否以管理员身份运行:

$currentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
$isAdmin = (New-Object Security.Principal.WindowsPrincipal $currentUser).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)

但为何停在那里?我对自己需要管理员的一些脚本感到恼火,因此我制作了一个非常漂亮的小块代码,将脚本打包到后台。

$asJobOrElevate = {
        param($CommandInfo, [switch]$OnlyCommand, [string[]]$AdditionalModules, [Hashtable]$Parameter, [Switch]$RequireAdmin)

        $currentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
        $isAdmin = (New-Object Security.Principal.WindowsPrincipal $currentUser).IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)

        if ($AsJob -or $Throttle -or (-not $isAdmin) -and $requireAdmin) {           
            if ($onlyCommand) {             
                $AdditionalModules = $AdditionalModules | Select-Object -Unique
                $myDefinition = [ScriptBLock]::Create("
$(if ($AdditionalModules) {"
    Import-Module '$($AdditionalModules -join ("','"))'
"})

function $commandInfo {
   $($commandInfo | Select-Object -ExpandProperty Definition)
 }
")                        
} else {
    $myModule = $CommandInfo.ScriptBlock.Module

    $AdditionalModules += $myModule | Split-Path
    $AdditionalModules += $myModule.RequiredModules | Split-Path
    $AdditionalModules = $AdditionalModules | Select-Object -Unique
    $myDefinition = [ScriptBLock]::Create("

$(if ($AdditionalModules) { "
    Import-Module '$($AdditionalModules -join ("','"))'
"})
")                   
 }
 $null = $Parameter.Remove('AsJob')                                    
 $null = $Parameter.Remove('Throttle')
 $null = $Parameter.Remove('RequireAdmin')                                    
 $myJob= [ScriptBLock]::Create("" + {                        
param([Hashtable]$parameter)                         

} + $myDefinition + "                        

        $commandInfo `@parameter                        
")      



          if ($Throttle) {

            $jobLaunched=  $false

            do {
                if ($myJobs) {
                    $myJobs | 
                        Receive-Job
                }


                $runningJobs = $myJobs | 
                    Where-Object { $_.State -ne 'Running' }
 if ($runningJobs) {
                    $runningJobs | 
                        Remove-Job -Force
                }



                if ($myJobs.Count -lt $throttle) {
                    $null = Start-Job -Name "${MyCmd}_Background_Job" -ScriptBlock $myJob -ArgumentList $Parameter
                    $JobLaunched = $true
                }

                $myJobs =  Get-Job -Name "${MyCmd}_Background_Job" -ErrorAction SilentlyContinue
                Write-Progress "Waiting for Jobs to Complete" "$($myJobs.Count) Running" -Id $ProgressId  
            } until ($jobLaunched)

            $myJobs =  Get-Job -Name "${MyCmd}_Background_Job" -ErrorAction SilentlyContinue
            $myJobs  | 
                Wait-Job | 
                Receive-Job
            return 
        } elseif ($asJob) {
            return Start-Job -ScriptBlock $myJob -ArgumentList $Parameter -Name "${CommandInfo}_Background_Job"

        } elseif ((-not $isAdmin) -and $RequireAdmin) {
                $fullCommand = "
 `$parameter = $(Write-PowerShellHashtable -InputObject $parameter)
 & { $myJob } `$parameter

 "

            $encodedCommand = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($fullCommand))


            return  Start-Process powershell -Verb Runas -ArgumentList '-encodedCommand', $encodedCommand -PassThru

        }
    }
    }

原谅可怕的缩进。长代码块不是StackOverflow的朋友。如果你用这样的行运行该scriptblock:

$launched = . $asJobOrElevate $MyInvocation.MyCommand -Parameter $psBoundParameters -RequireAdmin

它将以管理员身份启动,并提供UAC提示,如果他们已经不是。它还支持在后台作业中运行该命令或将其限制为许多正在运行的作业。

要在其原生栖息地中查看此代码技巧(或者可能只是更容易复制/粘贴),请查看Powershell Pipeworks中的ConvertTo-ModuleService源代码。它位于函数的顶部,它是begin {}块中的第一个东西。