Powershell - การยกระดับแพ้ไดเรกทอรีปัจจุบัน


3

ปัญหาหนึ่งนำไปสู่ปัญหาอื่น! ความช่วยเหลือผู้ใช้เพียงแก้ไขปัญหาหนึ่งซึ่งนำไปสู่ปัญหาอื่นเมื่อฉันยังทำงานกับสคริปต์นี้ต่อไป สคริปต์ของฉันเรียกใช้การตรวจสอบเพื่อดูว่าผู้ใช้ปัจจุบันเป็นผู้ดูแลระบบดังนี้:

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{   
$arguments = "& '" + $myinvocation.mycommand.definition + "'" + $loc
Start-Process powershell -Verb runAs -ArgumentList $arguments
Break
}

อาร์กิวเมนต์สำหรับ $ loc คือพารามิเตอร์ที่ แต่เดิมผ่านไฟล์แบตช์ที่ดังต่อไปนี้:

@setlocal enableextensions
@cd /d "%~dp0"
SET current="%~dp0
START /WAIT powershell.exe -ExecutionPolicy Bypass -File "JavaInstall.ps1" -loc %current%

ที่ด้านบนของไฟล์ Powershell เรามี:

param(
[string]$loc
)

งานนี้ภายใต้เงื่อนไขสองประการ:

1) ผู้ใช้เป็นผู้ดูแลระบบอยู่แล้ว
2) โฟลเดอร์ที่เรียกใช้จากจุดใด ๆ ในการสำรวจจะไม่มีที่ว่าง

เมื่อสิ่งนี้ถูกเรียกใช้จากโฟลเดอร์เช่น: C: \ Users \ User \ Desktop \ Java การทดสอบล้มเหลวโดยฉับพลัน ถ้าฉันเขียน - โฮสต์ระหว่างทางฉันจะเห็นว่าตัวแปร $ loc นั้นถูกต้องจนกระทั่งหลังจากระดับความสูง หลังจากยกระดับสิ่งใด ๆ ก็ตามหลังจากพื้นที่หายไป ถ้าฉันเรียกใช้สิ่งนี้โดยตรงในฐานะผู้ดูแลระบบแน่นอนว่ามันผ่านการยกระดับและทำงานได้แม้มีช่องว่างในโฟลเดอร์ แต่ฉันไม่ต้องการให้คลิกขวาเรียกใช้เป็นสถานการณ์สมมติ ความคิดใด ๆ ที่อาจทำให้ข้อความหายไปหลังจากช่องว่างระหว่างการยกระดับ


สำหรับเส้นทางที่มีปัญหาช่องว่างอาจเป็นเพราะคุณไม่มีใบเสนอราคาปิดในบรรทัดนี้SET current="%~dp0
Ƭᴇcʜιᴇ007

สิ่งที่แปลกคือมีอะไร แต่การอ้างถึงเพียงจุดเดียวในจุดนั้นทำให้มันตัดสิ่งที่มีช่องว่างก่อนถึงระดับความสูง ฉันอาจใช้คำสั่งนั้นอย่างไม่ถูกต้องในการเริ่มต้นด้วยเหมือนที่ดูเหมือนแปลก
ทิมพี

อาจจะแค่ใส่เครื่องหมายคำพูดไว้บนบรรทัดนั้นและพันคำแทน%current%ด้วย (ในSTARTบรรทัดแบทช์)
Ƭᴇcʜιᴇ007

เหตุใดคุณจึงเริ่มสคริปต์ชุดงานในตอนแรก คุณไม่เพียงแค่โทรไปที่ Powershell โดยตรงด้วยการอนุญาตที่ถูกต้องหรือไม่?
Zoredache

ฉันคิดว่าจะเรียกใช้สคริปต์ Powershell บนคอมพิวเตอร์เครื่องอื่นจำเป็นต้องตั้ง ExecutionPolicy เนื่องจากเราไม่ได้รับการรับรองและได้รับพฤติกรรมเริ่มต้นของ Powershell
ทิมพี

คำตอบ:


0

คุณกำลังจัดการกับการแยกคำสั่งหลายบรรทัดที่นี่จึงเป็นเหตุผลที่ทำให้การทำงานอย่างถูกต้องเป็นเรื่องยาก คุณต้องมีเครื่องหมายคำพูดรอบพา ธ ของคุณด้วยช่องว่างเมื่อมันส่งผ่านไปยัง PowerShell (จากไฟล์ bat) และเมื่อมันส่งผ่านจาก Powershell (ไปยัง cmdlet เริ่มกระบวนการ) นี่หมายถึงการหลบหนีที่รุนแรง:

  1. ลบต่อท้ายทับขวาจาก%~dp0หรือมันจะยุ่งกับกับการหลบหนีในเล่ม 2
  2. ยกเว้นเครื่องหมายคำพูดด้วยเครื่องหมายแบ็กสแลช ( \) สำหรับSTARTคำสั่งเนื่องจากวิธีที่ตัวแยกวิเคราะห์บรรทัดคำสั่ง C ทำงาน :

    เครื่องหมายอัญประกาศคู่นำหน้าด้วยแบ็กสแลช \ "
    ถูกตีความเป็นเครื่องหมายอัญประกาศคู่ตามตัวอักษร (")

  3. Escape เครื่องหมายคำพูดใน PowerShell เมื่อใช้Start-Processcmdlet

    1. สำหรับ-Fileพารามิเตอร์:

      "`"$($MyInvocation.MyCommand.Path)`""
      
    2. สำหรับการ$Locโต้แย้ง:

      "\`"$Loc\`""
      

ตัวอย่างด้านล่างใช้งานได้สำหรับฉันและช่วยให้เส้นทางมีช่องว่างครบถ้วนในขณะยกระดับตนเอง

Bat Launcher:

SETLOCAL EnableExtensions

:: Get current directory
SET current=%~dp0

:: Does "current" variable have a trailing slash? If so, remove it
IF %current:~-1%==\ SET current=%current:~,-1%

cd /d %current%

START /WAIT powershell.exe -ExecutionPolicy Bypass -File "JavaInstall.ps1" -Loc \""%current%\""

รหัสยกระดับ PowerShell:

Param(
    [string]$Loc
)

$Delay = 5
Write-Host "`$Loc argument: $Loc"

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(
        [Security.Principal.WindowsBuiltInRole] 'Administrator')
)
{
    Write-Host "Not elevated, restarting in $Delay seconds ..."
    Start-Sleep -Seconds $Delay

    $Arguments =  @(
        '-NoProfile',
        '-NoExit',
        '-File',
        "`"$($MyInvocation.MyCommand.Path)`"",
        "\`"$Loc\`""
    )
    Start-Process -FilePath PowerShell.exe -Verb RunAs -ArgumentList $Arguments
    Break
}
else
{
    Write-Host "Already elevated, exiting in $Delay seconds..."
    Start-Sleep -Seconds $Delay
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.