ใช้คำสั่งในฐานะผู้ดูแลระบบโดยใช้ PowerShell หรือไม่


280

คุณรู้ได้อย่างไรว่าคุณเป็นผู้ใช้ที่เป็นผู้ดูแลระบบและคุณสามารถคลิกขวาพูดสคริปต์ชุดและเรียกใช้ในฐานะผู้ดูแลระบบโดยไม่ต้องใส่รหัสผ่านผู้ดูแลระบบ

ฉันสงสัยว่าจะทำอย่างไรกับสคริปต์ PowerShell ฉันไม่ต้องการที่จะต้องป้อนรหัสผ่านของฉัน; ผมแค่อยากจะเลียนแบบคลิกขวาที่เรียกใช้เป็นผู้ดูแลระบบวิธีการ

ทุกสิ่งที่ฉันอ่านมาคุณต้องระบุรหัสผ่านผู้ดูแลระบบ


ลองgsudoดู sudo โอเพ่นซอร์สฟรีสำหรับ windows ที่อนุญาตให้ดำเนินการในฐานะผู้ดูแลระบบจากบรรทัดคำสั่ง ป๊อปอัพ UAC จะปรากฏขึ้น
Gerardo Grignoli

คำตอบ:


312

หากคอนโซลปัจจุบันไม่ได้รับการยกระดับและการดำเนินการที่คุณพยายามทำต้องใช้สิทธิ์ระดับสูงจากนั้นคุณสามารถเริ่ม PowerShell ด้วยRun as administratorตัวเลือก:

PS> Start-Process powershell -Verb runAs

1
นั่นเป็นวิธีเดียวที่จะทำให้สำเร็จ อย่างไรก็ตามหน้าต่างเชลล์ที่เพิ่มเข้ามานั้นพิสูจน์แล้วว่ามีปัญหาในหลายกรณี ฉันสิ้นสุดการกำหนดค่าสิ่งที่เรียกใช้สคริปต์เพื่อทำงานในฐานะผู้ดูแลระบบ (เช่นผ่านรีจิสทรี)
Jacek Gorgoń

17
สิ่งนี้จะเปิดคอนโซลใหม่ที่ตำแหน่งอื่น มีวิธีการเรียกใช้ในฐานะผู้ดูแลระบบที่ไดเรกทอรีทำงานปัจจุบันหรือไม่?
ภาชนะบรรจุที่

11
start-process -verb runAs "<cmd>" -argumentlist "<args1> <args2>";)
Dev Anand Sadasivam


1
คุณสามารถค้นหาเอกสารได้ที่นี่: docs.microsoft.com/en-us/powershell/module/ ......สำหรับไฟล์. exe คำกริยาสามารถ: เปิด, RunAs, RunAsUser
Kevin Xiong

114

นี่คือส่วนเพิ่มเติมจากคำแนะนำของ Shay Levi (เพียงเพิ่มบรรทัดเหล่านี้ที่จุดเริ่มต้นของสคริปต์):

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))

{   
$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process powershell -Verb runAs -ArgumentList $arguments
Break
}

ซึ่งส่งผลให้สคริปต์ปัจจุบันถูกส่งผ่านไปยังกระบวนการ powershell ใหม่ในโหมดผู้ดูแลระบบ (หากผู้ใช้ปัจจุบันมีการเข้าถึงโหมดผู้ดูแลระบบและสคริปต์ไม่ได้เปิดตัวในฐานะผู้ดูแลระบบ)


6
สิ่งนี้ใช้ได้กับฉัน:if (-not (([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)))
G. ลอมบาร์ด

แก้ไขได้อย่างง่ายดายเพียงแค่โยนข้อผิดพลาดเมื่อไม่ได้ทำงานในฐานะผู้ดูแลระบบ เพียงแค่ifใส่ข้อความแล้วใส่throwเข้าไปในบล็อกนั้น
jpmc26

2
ความคิดเห็นของ @ G.Lombard มีข้อผิดพลาดทางไวยากรณ์เล็กน้อย นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน:if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
angularsen

ไวยากรณ์เดียวที่ได้ผลสำหรับฉันอยู่ในโพสต์ดั้งเดิมไม่ใช่โดย G.Lombard หรือ anjdreas
Nicolas Mommaerts

2
ฉันเห็นด้วยกับการใช้ค่า enum ( [Security.Principal.WindowsBuiltInRole]::Administrator)) ควรเป็นที่ต้องการอาร์กิวเมนต์สตริง"Administrator"- ฉันพบสภาพแวดล้อมที่มีความปลอดภัยที่มีการเปลี่ยนชื่อบทบาทในตัว
eXavier

104

สคริปต์ PowerShell ที่ยกระดับตนเอง

Windows 8.1 / PowerShell 4.0 +

หนึ่งบรรทัด :)

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; exit }

# Your script here

143
ดีเทคนิคพูดทุกอย่าง "หนึ่งบรรทัด" ถ้าจัดรูปแบบเช่นนั้น แต่นั่นไม่ได้ทำให้เป็นจริง "หนึ่งบรรทัด"
ผู้อพยพผิดกฎหมาย

3
ข้อเสียเปรียบ: หากคุณเข้าสู่ระบบที่ไม่ใช่ผู้ดูแลระบบในการแจ้งให้คุณสิ้นสุดในวงแยกออกไม่สิ้นสุด
Manuel Faux

3
แต่นี่ไม่ผ่าน args
kyb

2
ในการผ่าน args ฉันได้แก้ไขเป็น:if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`" `"$args`"" -Verb RunAs; exit }
ab

2
คำตอบนี้ไม่ได้รักษาไดเรกทอรีทำงาน ดูที่นี่สำหรับสิ่งที่ทำได้: stackoverflow.com/a/57035712/2441655
Venryx

45

เบนจามินอาร์มสตรองโพสต์บทความดี ๆ เกี่ยวกับการยกระดับตัวเองสคริปต์ มีปัญหาเล็กน้อยกับรหัสของเขา รุ่นที่ปรับเปลี่ยนตามการแก้ไขที่แนะนำในความคิดเห็นด้านล่าง

โดยพื้นฐานแล้วจะได้รับข้อมูลประจำตัวที่เกี่ยวข้องกับกระบวนการปัจจุบันตรวจสอบว่าเป็นผู้ดูแลระบบหรือไม่และสร้างกระบวนการ PowerShell ใหม่ด้วยสิทธิ์ผู้ดูแลระบบและยุติกระบวนการเก่า

# Get the ID and security principal of the current user account
$myWindowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent();
$myWindowsPrincipal = New-Object System.Security.Principal.WindowsPrincipal($myWindowsID);

# Get the security principal for the administrator role
$adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator;

# Check to see if we are currently running as an administrator
if ($myWindowsPrincipal.IsInRole($adminRole))
{
    # We are running as an administrator, so change the title and background colour to indicate this
    $Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition + "(Elevated)";
    $Host.UI.RawUI.BackgroundColor = "DarkBlue";
    Clear-Host;
}
else {
    # We are not running as an administrator, so relaunch as administrator

    # Create a new process object that starts PowerShell
    $newProcess = New-Object System.Diagnostics.ProcessStartInfo "PowerShell";

    # Specify the current script path and name as a parameter with added scope and support for scripts with spaces in it's path
    $newProcess.Arguments = "& '" + $script:MyInvocation.MyCommand.Path + "'"

    # Indicate that the process should be elevated
    $newProcess.Verb = "runas";

    # Start the new process
    [System.Diagnostics.Process]::Start($newProcess);

    # Exit from the current, unelevated, process
    Exit;
}

# Run your code that needs to be elevated here...

Write-Host -NoNewLine "Press any key to continue...";
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown");

ฉันไม่ได้รับชื่อสคริปต์และ params ที่ได้รับการแก้ไขอย่างถูกต้องดังนั้นฉันจึงปิดการดำเนินการใน cmd.exe / c $newProcess = new-object System.Diagnostics.ProcessStartInfo “cmd.exe” $newProcess.Arguments = ‘/c ‘ + [System.Environment]::GetCommandLineArgs() $newProcess.WorkingDirectory = [environment]::CurrentDirectory
xverges

มีข้อได้เปรียบในการทำสิ่งนี้แทนการเริ่มกระบวนการหรือไม่? ฉันอยากรู้เกี่ยวกับความแตกต่างระหว่างวิธีนี้และวิธีการอื่นที่โพสต์ไว้ด้านบนและในเธรดอื่น ๆ พวกเขาทั้งสองต้องพึ่งพา .NET แต่วิธีนี้มากขึ้น ...
ZaxLofful

ฉันพบความคิดเห็นต่างๆที่เกี่ยวข้องกับลิงก์โดยตรงไปยังโพสต์ของ Armstrong (ประโยคเริ่มต้นของโพสต์นี้) เพื่อเป็นประโยชน์มากเช่นกัน
BentChainRing

2
คำตอบนี้ไม่ได้รักษาไดเรกทอรีทำงาน ดูที่นี่สำหรับสิ่งที่ทำได้: stackoverflow.com/a/57035712/2441655
Venryx

22

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

@echo off

set scriptFileName=%~n0
set scriptFolderPath=%~dp0
set powershellScriptFileName=%scriptFileName%.ps1

powershell -Command "Start-Process powershell \"-ExecutionPolicy Bypass -NoProfile -NoExit -Command `\"cd \`\"%scriptFolderPath%\`\"; & \`\".\%powershellScriptFileName%\`\"`\"\" -Verb RunAs"

แค่นั้นแหละ!

นี่คือคำอธิบาย:

สมมติว่าสคริปต์ PowerShell ของคุณอยู่ในเส้นทางที่แบทช์ไฟล์ของคุณต้องมีเส้นทางC:\Temp\ScriptTest.ps1 C:\Temp\ScriptTest.batเมื่อมีคนดำเนินการแบตช์ไฟล์นี้ขั้นตอนต่อไปนี้จะเกิดขึ้น:

  1. cmd จะดำเนินการคำสั่ง

    powershell -Command "Start-Process powershell \"-ExecutionPolicy Bypass -NoProfile -NoExit -Command `\"cd \`\"C:\Temp\`\"; & \`\".\ScriptTest.ps1\`\"`\"\" -Verb RunAs"
  2. เซสชัน PowerShell ใหม่จะเปิดขึ้นและคำสั่งต่อไปนี้จะถูกดำเนินการ:

    Start-Process powershell "-ExecutionPolicy Bypass -NoProfile -NoExit -Command `"cd \`"C:\Temp\`"; & \`".\ScriptTest.ps1\`"`"" -Verb RunAs
  3. เซสชัน PowerShell ใหม่ใหม่พร้อมสิทธิ์ระดับผู้ดูแลระบบจะเปิดในsystem32โฟลเดอร์และอาร์กิวเมนต์ต่อไปนี้จะถูกส่งผ่านไป:

    -ExecutionPolicy Bypass -NoProfile -NoExit -Command "cd \"C:\Temp\"; & \".\ScriptTest.ps1\""
  4. คำสั่งต่อไปนี้จะถูกดำเนินการด้วยสิทธิ์ระดับผู้ดูแล:

    cd "C:\Temp"; & ".\ScriptTest.ps1"

    เมื่อพา ธ สคริปต์และอาร์กิวเมนต์ชื่อถูกยกมาเป็นสองเท่าพวกเขาสามารถมีช่องว่างหรืออักขระเครื่องหมายคำพูดเดี่ยว ( ')

  5. โฟลเดอร์ปัจจุบันจะเปลี่ยนจากsystem32เป็นC:\TempและScriptTest.ps1จะถูกเรียกใช้งานสคริปต์ เมื่อพารามิเตอร์-NoExitถูกส่งผ่านไปหน้าต่างจะไม่ถูกปิดแม้ว่าสคริปต์ powershell ของคุณจะมีข้อยกเว้น


ถ้าฉันทำสิ่งนี้ฉันจะได้รับป๊อปอัพที่ถามฉันว่าฉันอนุญาตให้ PowerShell ทำการเปลี่ยนแปลงกับระบบของฉันหรือไม่ สิ่งนี้ทำให้ไม่สามารถใช้งานระบบอัตโนมัติได้
จอห์น Slegers

@JohnSlegers หากคุณต้องการทำให้เป็นอัตโนมัติคุณต้องรับผิดชอบในการตรวจสอบให้แน่ใจว่ากระบวนการอัตโนมัตินั้นทำงานเป็นผู้ดูแลระบบ หากคุณสามารถยกระดับกระบวนการที่ไม่ใช่ผู้ดูแลระบบให้เป็นกระบวนการผู้ดูแลระบบโดยอัตโนมัติโดยไม่ต้องมีการโต้ตอบกับผู้ใช้ซึ่งจะทำให้จุดประสงค์ในการกำหนดให้กระบวนการมีสิทธิ์ผู้ดูแลระบบเป็นอันดับแรก
meustrus

@ meustrus: ในฐานะวิศวกรเผยแพร่งานของฉันเกี่ยวข้องกับการสร้างและบำรุงรักษากระบวนการบิลด์ที่รันอย่างสมบูรณ์โดยอัตโนมัติไม่ว่าจะเป็นระยะหรือตามเกณฑ์ที่แน่นอน กระบวนการเหล่านี้บางอย่างต้องการสิทธิ์ผู้ดูแลระบบและการขอให้ผู้ใช้ป้อนข้อมูลทำให้กระบวนการไม่สามารถใช้งานได้ในบริบทนี้ - ใน Linux คุณสามารถบรรลุนี้โดยใช้sudoคำสั่งและการกำหนดค่าผู้ใช้ที่คุณใช้สำหรับกระบวนการอัตโนมัติที่มีNOPASSWD: ALLอยู่ในsudoersไฟล์
John Slegers

1
นี่เป็นคำตอบที่ดีกว่าคำอื่น ๆ เพราะมันเก็บรักษาไดเรกทอรีการทำงาน ฉันรวบรวมตัวแปรหนึ่งบรรทัดของวิธีการนี้ไว้ที่นี่ (หนึ่งสำหรับ cmd / batch หนึ่งรายการสำหรับเมนูบริบทของ Explorer และอีกหนึ่งสำหรับ powershell): stackoverflow.com/a/57033941/2441655
Venryx

17

ต่อไปนี้เป็นตัวอย่างข้อมูลที่ยกระดับตนเองสำหรับสคริปต์ Powershell ซึ่งเก็บรักษาไดเรกทอรีการทำงาน :

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Start-Process PowerShell -Verb RunAs "-NoProfile -ExecutionPolicy Bypass -Command `"cd '$pwd'; & '$PSCommandPath';`"";
    exit;
}

# Your script here

การรักษาไดเรกทอรีการทำงานเป็นสิ่งสำคัญสำหรับสคริปต์ที่ดำเนินการกับเส้นทางแบบสัมพันธ์ คำตอบอื่น ๆ เกือบทั้งหมดไม่รักษาเส้นทางนี้ไว้ซึ่งอาจทำให้เกิดข้อผิดพลาดที่ไม่คาดคิดในสคริปต์ที่เหลือ

หากคุณไม่ต้องการใช้สคริปต์ / ตัวอย่างข้อมูลที่ยกระดับตนเองและต้องการเพียงแค่วิธีง่ายๆในการเปิดใช้งานสคริปต์ในฐานะผู้ดูแลระบบ (เช่นจากเมนูบริบทของ Explorer) ดูคำตอบอื่น ๆ ของฉันที่นี่: https: // stackoverflow .com / a / 57033941/2441655


16

การใช้

#Requires -RunAsAdministrator

ยังไม่ได้ระบุ ดูเหมือนว่าจะอยู่ที่นั่นตั้งแต่ PowerShell 4.0 เท่านั้น

http://technet.microsoft.com/en-us/library/hh847765.aspx

เมื่อเพิ่มพารามิเตอร์สวิตช์นี้ในคำสั่งที่คุณต้องการจะระบุว่าเซสชัน Windows PowerShell ที่คุณใช้งานสคริปต์จะต้องเริ่มต้นด้วยสิทธิ์ผู้ใช้ที่ผ่านการยกระดับ (เรียกใช้ในฐานะผู้ดูแลระบบ)

สำหรับฉันดูเหมือนว่าเป็นวิธีที่ดีที่จะไปเกี่ยวกับเรื่องนี้ แต่ฉันไม่แน่ใจว่าประสบการณ์ภาคสนามยัง PowerShell 3.0 runtimes อาจเพิกเฉยต่อสิ่งนี้หรือแย่กว่านั้นเป็นข้อผิดพลาด

เมื่อรันสคริปต์ในฐานะที่ไม่ใช่ผู้ดูแลระบบจะได้รับข้อผิดพลาดต่อไปนี้:

ไม่สามารถเรียกใช้สคริปต์ 'StackOverflow.ps1' ได้เนื่องจากมีคำสั่ง "#requires" สำหรับใช้เป็นผู้ดูแลระบบ เซสชัน Windows PowerShell ปัจจุบันไม่ได้ทำงานในฐานะผู้ดูแลระบบ เริ่ม Windows PowerShell โดยใช้ตัวเลือก Run as Administrator จากนั้นลองเรียกใช้สคริปต์อีกครั้ง

+ CategoryInfo          : PermissionDenied: (StackOverflow.ps1:String) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ScriptRequiresElevation

7
น่าเสียดายที่มันทำให้สคริปต์ล้มเหลวโดยมีข้อผิดพลาดหากเชลล์ไม่มีสิทธิ์ของผู้ดูแลระบบ มันไม่ยกระดับด้วยตัวเอง
Jacek Gorgoń

PS3 ดูเหมือนจะให้ข้อผิดพลาดตามที่แนะนำ Parameter RunAsAdministrator requires an argumentฉันได้รับ @ akauppi ฉันไม่เชื่อว่าพวกเขามักจะคิด
jpmc26

14

คุณสามารถเพิ่มรายการรีจิสตรีได้อย่างง่ายดายเพื่อรับเมนูบริบท "เรียกใช้ในฐานะผู้ดูแลระบบ" สำหรับ.ps1ไฟล์:

New-Item -Path "Registry::HKEY_CLASSES_ROOT\Microsoft.PowershellScript.1\Shell\runas\command" `
-Force -Name '' -Value '"c:\windows\system32\windowspowershell\v1.0\powershell.exe" -noexit "%1"'

(อัปเดตเป็นสคริปต์ที่ง่ายขึ้นจาก @Shay)

โดยทั่วไปที่HKCR:\Microsoft.PowershellScript.1\Shell\runas\commandตั้งค่าเริ่มต้นเพื่อเรียกใช้สคริปต์โดยใช้ Powershell


ไม่ทำงานคุณกำลังสร้างคีย์ '(ค่าเริ่มต้น)' ไม่อัปเดตค่าคีย์ '(ค่าเริ่มต้น)' ฉันสามารถย่อโค้ดให้เป็นหนึ่งซับที่ใช้ได้กับฉัน คุณสามารถทดสอบได้หรือไม่ รายการใหม่ - แพทช์ "รีจิสทรี :: HKEY_CLASSES_ROOT \ Microsoft.PowershellScript.1 \ Shell \ runas \ คำสั่ง" - บังคับ - ชื่อ '' - ค่า '"c: \ windows \ system32 \ windowspowershell \ v1.0 \ powershell.exe" -noexit "% 1" '
Shay Levy

@Shay Levy - สวัสดี Shay ขอบคุณสำหรับการอัปเดต ฉันได้อัพเดตคำตอบแล้ว มันใช้งานได้ดี แต่สิ่งที่ฉันได้ทำงานก็เช่นกัน ฉันไม่ได้ทำการแก้ไข reg กับ Powershell มากนัก แต่การใช้ "(ค่าเริ่มต้น)" เป็นสิ่งที่ฉันได้เห็นเป็นตัวอย่าง มันไม่ได้สร้างคีย์ใหม่ (ซึ่งบางอย่างเช่นค่าเริ่มต้นจะมี) แต่ทำการอัปเดตคีย์เริ่มต้นตามที่คาดไว้ คุณลองหรือแค่เดาจาก(default)ส่วน?
manojlds

ฉันลองแล้ว มันสร้างคีย์ '(ค่าเริ่มต้น)' ภายใต้คีย์คำสั่ง
Shay Levy

สิ่งนี้ใช้ได้ผลสำหรับฉันหลังจากการเปลี่ยนแปลงเล็กน้อยกับค่ารีจิสตรี: "c: \ windows \ system32 \ windowspowershell \ v1.0 \ powershell.exe" - การดำเนินการทางรีโมท RemoteSigned - ไม่มีการประมวลผล "& '% 1'"
MikeBaz - MSFT

1
ค่ารีจิสตรีในคำตอบมีปัญหาทุกประเภท มันไม่ได้รันคำสั่งจริงและไม่ได้อ้างอิงชื่อสคริปต์อย่างถูกต้อง ฉันใช้สิ่งต่อไปนี้เรียบร้อยแล้ว:"c:\windows\system32\windowspowershell\v1.0\powershell.exe" -noexit -command "& '%1'"
Kal Zekdor

10

รหัสที่โพสต์โดย Jonathan และ Shay Levy ไม่ได้ผลสำหรับฉัน

กรุณาค้นหารหัสการทำงานด้านล่าง:

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{   
#"No Administrative rights, it will display a popup window asking user for Admin rights"

$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process "$psHome\powershell.exe" -Verb runAs -ArgumentList $arguments

break
}
#"After user clicked Yes on the popup, your file will be reopened with Admin rights"
#"Put your code here"

2
มีประโยชน์มากและเป็นวิธีแก้ปัญหาเชิง pratical: เพิ่ง perpended กับสคริปต์ของฉันและใช้งานได้
CDuv

3
@Abatonime วิธีการเกี่ยวกับคุณชี้ให้เห็นถึงความแตกต่างที่ง่ายต่อการพลาดเพื่อประโยชน์ของผู้อ่านของคุณแทน? สุจริตการเปลี่ยนแปลงนั้นไม่คุ้มค่ามากกว่าความคิดเห็นในคำตอบอื่น ๆ
jpmc26

8

คุณต้องรันสคริปต์อีกครั้งด้วยสิทธิ์ระดับผู้ดูแลและตรวจสอบว่าสคริปต์เปิดใช้งานในโหมดนั้นหรือไม่ ด้านล่างนี้ผมได้เขียนสคริปต์ที่มีสองฟังก์ชั่น: DoElevatedOperationsและDoStandardOperations คุณควรวางรหัสของคุณที่ต้องการสิทธิ์ผู้ดูแลระบบในการดำเนินการแรกและการดำเนินการมาตรฐานในที่สอง IsRunAsAdminตัวแปรจะใช้เพื่อระบุโหมดผู้ดูแลระบบ

รหัสของฉันแยกง่ายจากสคริปต์ Microsoft ที่สร้างขึ้นโดยอัตโนมัติเมื่อคุณสร้างแพ็คเกจแอปสำหรับแอพ Windows Store

param(
    [switch]$IsRunAsAdmin = $false
)

# Get our script path
$ScriptPath = (Get-Variable MyInvocation).Value.MyCommand.Path

#
# Launches an elevated process running the current script to perform tasks
# that require administrative privileges.  This function waits until the
# elevated process terminates.
#
function LaunchElevated
{
    # Set up command line arguments to the elevated process
    $RelaunchArgs = '-ExecutionPolicy Unrestricted -file "' + $ScriptPath + '" -IsRunAsAdmin'

    # Launch the process and wait for it to finish
    try
    {
        $AdminProcess = Start-Process "$PsHome\PowerShell.exe" -Verb RunAs -ArgumentList $RelaunchArgs -PassThru
    }
    catch
    {
        $Error[0] # Dump details about the last error
        exit 1
    }

    # Wait until the elevated process terminates
    while (!($AdminProcess.HasExited))
    {
        Start-Sleep -Seconds 2
    }
}

function DoElevatedOperations
{
    Write-Host "Do elevated operations"
}

function DoStandardOperations
{
    Write-Host "Do standard operations"

    LaunchElevated
}


#
# Main script entry point
#

if ($IsRunAsAdmin)
{
    DoElevatedOperations
}
else
{
    DoStandardOperations
}

7

เพิ่ม 2 เซนต์ของฉัน รุ่นที่เรียบง่ายของฉันขึ้นอยู่กับเซสชั่นเน็ตซึ่งทำงานได้ตลอดเวลาใน Windows 7 / Windows 10 ทำไมมันซับซ้อนมากกว่านี้?

if (!(net session)) {$path =  "& '" + $myinvocation.mycommand.definition + "'" ; Start-Process powershell -Verb runAs -ArgumentList $path ; exit}

เพียงเพิ่มที่ด้านบนสุดของสคริปต์และมันจะทำงานในฐานะผู้ดูแลระบบ


1
มีวิธีการใส่ข้อความถึงผู้ใช้หลังจากที่ "ปฏิเสธการเข้าถึง" ปรากฏขึ้นหรือไม่?
ycomp

... หรือเพื่อหลีกเลี่ยงข้อความทั้งหมด
GünterZöchbauer

1
@ GünterZöchbauer @ycompif (!(net session 2>&1 | Out-Null)) { ... ... } else { echo "your message" }
Matthieu

รับข้อผิดพลาดสำหรับสิ่งนี้cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.
user2305193

1
@ user2305193 Set-ExecutionPolicy -ExecutionPolicy <PolicyName>คุณสามารถตั้งค่าเป็นbypass แต่bypassอาจเป็นอันตรายได้ ตั้งเป็นAllSigned
AliFurkan

5

พฤติกรรมนี้เกิดจากการออกแบบ การรักษาความปลอดภัยมีหลายชั้นเนื่องจาก Microsoft ไม่ต้องการให้ไฟล์. ps1 เป็นไวรัสอีเมลตัวล่าสุด บางคนคิดว่านี่เป็นสิ่งที่ตรงกันข้ามกับความคิดของระบบอัตโนมัติซึ่งเป็นสิ่งที่ยุติธรรม รูปแบบการรักษาความปลอดภัยของ Vista + คือการ "ยกเลิกการใช้งานอัตโนมัติ" ซึ่งจะทำให้ผู้ใช้โอเค

อย่างไรก็ตามฉันสงสัยว่าคุณเปิดใช้งาน PowerShell ด้วยตัวเองในระดับสูงควรจะสามารถเรียกใช้ไฟล์แบตช์โดยไม่ต้องขอรหัสผ่านอีกครั้งจนกว่าคุณจะปิด PowerShell


5

นอกจากนี้คุณยังสามารถบังคับให้แอปพลิเคชันเปิดเป็นผู้ดูแลระบบได้หากคุณมีบัญชีผู้ดูแลระบบ

ป้อนคำอธิบายรูปภาพที่นี่

ค้นหาไฟล์คลิกขวา> Properties> Shortcut> AdvancedและเลือกRun as Administrator

จากนั้นคลิกตกลง


1
คุณเขียนสคริปต์นี้ได้อย่างไร
Dieter

4

C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShellเป็นที่ตั้งของทางลัดของ PowerShell มันก็ยังไปที่อื่นเพื่อเรียก 'exe' ( %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe) ที่แท้จริง

เนื่องจาก PowerShell เป็นโปรไฟล์ผู้ใช้เมื่อต้องคำนึงถึงสิทธิ์ หากชื่อผู้ใช้ / โปรไฟล์ของคุณมีสิทธิ์ในการทำบางสิ่งภายใต้โปรไฟล์นั้นใน PowerShell คุณโดยทั่วไปก็สามารถทำได้เช่นกัน C:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShellที่ถูกกล่าวว่ามันจะทำให้รู้สึกว่าคุณจะเปลี่ยนทางลัดที่อยู่ภายใต้โปรไฟล์ผู้ใช้ของคุณตัวอย่างเช่น

คลิกขวาและคลิกคุณสมบัติ คลิกปุ่ม "ขั้นสูง" ภายใต้แท็บ "ทางลัด" ที่อยู่ด้านล่างช่องข้อความ "ความคิดเห็น" ที่อยู่ติดกับด้านขวาของปุ่มอื่น ๆ สองปุ่ม "เปิดตำแหน่งไฟล์" และ "เปลี่ยนไอคอน" ตามลำดับ

ทำเครื่องหมายในช่องที่อ่านว่า "Run as Administrator" คลิกOKแล้วและApply OKคลิกขวาที่ไอคอนที่ชื่อว่า 'Windows PowerShell' อีกครั้งC:\Users\"username"\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Windows PowerShellและเลือก "Pin to Start Menu / Taskbar"

ตอนนี้เมื่อใดก็ตามที่คุณคลิกที่ไอคอนมันจะเรียกใช้UACสำหรับการเพิ่ม หลังจากเลือก 'ใช่' คุณจะสังเกตเห็นคอนโซล PowerShell เปิดขึ้นและจะมีป้ายกำกับว่า "ผู้ดูแลระบบ" ที่ด้านบนของหน้าจอ

หากต้องการไปอีกขั้นหนึ่ง ... คุณสามารถคลิกขวาที่ไอคอนลัดเดียวกันในตำแหน่งโปรไฟล์ของ Windows PowerShell และกำหนดแป้นพิมพ์ลัดที่จะทำสิ่งเดียวกันทุกประการเหมือนกับว่าคุณคลิกไอคอนที่เพิ่งเพิ่มเข้าไป ดังนั้นที่มันว่า "ทางลัด" วางในคีย์ผสมแป้นพิมพ์ / ปุ่มที่ชอบ: Ctrl+ Alt+ P P(สำหรับ PowerShell) คลิกและApplyOK

ตอนนี้สิ่งที่คุณต้องทำคือกดปุ่มชุดที่คุณกำหนดและคุณจะเห็น UAC ถูกเรียกใช้และหลังจากที่คุณเลือก 'ใช่' คุณจะเห็นคอนโซล PowerShell ปรากฏขึ้นและแสดง "ผู้ดูแลระบบ" บนแถบชื่อเรื่อง


เพื่อน :) คำสำคัญในคำถามของ OP คือการเขียนสคริปต์ !! ไม่ใช่โซลูชันการคลิกเมาส์ UI บางอย่าง
คริสเตียน

3

ฉันพบวิธีการทำเช่นนี้ ...

สร้างแบตช์ไฟล์เพื่อเปิดสคริปต์ของคุณ:

@echo off
START "" "C:\Scripts\ScriptName.ps1"

จากนั้นสร้างทางลัดบนเดสก์ท็อปของคุณพูด (คลิกขวาใหม่ -> ทางลัด )

จากนั้นวางสิ่งนี้ลงในตำแหน่ง:

C:\Windows\System32\runas.exe /savecred /user:*DOMAIN*\*ADMIN USERNAME* C:\Scripts\BatchFileName.bat

เมื่อเปิดครั้งแรกคุณจะต้องป้อนรหัสผ่านของคุณหนึ่งครั้ง สิ่งนี้จะบันทึกลงในตัวจัดการข้อมูลรับรองของ Windows

หลังจากนี้คุณจะสามารถเรียกใช้ในฐานะผู้ดูแลระบบได้โดยไม่ต้องป้อนชื่อผู้ใช้หรือรหัสผ่านของผู้ดูแลระบบ


/ savecred ไม่ปลอดภัย!
Nathan Goings

นี่เป็นทางออกเดียวที่ไม่ใช้พรอมต์การยกระดับกราฟิกที่อาจไม่สามารถเข้าถึงได้ในเซสชันระยะไกล
DustWolf

3

ปัญหาเกี่ยวกับคำตอบของ@pgkและ@Andrew Odriคือเมื่อคุณมีพารามิเตอร์สคริปต์โดยเฉพาะเมื่อจำเป็น คุณสามารถแก้ปัญหานี้ได้โดยใช้วิธีการต่อไปนี้:

  1. ผู้ใช้คลิกขวาที่ไฟล์. ps1และเลือก 'Run with PowerShell': ถามเขาถึงพารามิเตอร์ผ่านกล่องอินพุต (นี่เป็นตัวเลือกที่ดีกว่าการใช้คุณลักษณะพารามิเตอร์HelpMessage );
  2. ผู้ใช้เรียกใช้งานสคริปต์ผ่านคอนโซล: อนุญาตให้เขาส่งพารามิเตอร์ที่ต้องการและให้คอนโซลบังคับให้เขาแจ้งให้ทราบถึงข้อบังคับที่บังคับใช้

นี่คือวิธีที่จะเป็นรหัสหากสคริปต์มีพารามิเตอร์บังคับให้ComputerNameและPort :

[CmdletBinding(DefaultParametersetName='RunWithPowerShellContextMenu')]
param (
    [parameter(ParameterSetName='CallFromCommandLine')]
    [switch] $CallFromCommandLine,

    [parameter(Mandatory=$false, ParameterSetName='RunWithPowerShellContextMenu')]
    [parameter(Mandatory=$true, ParameterSetName='CallFromCommandLine')]
    [string] $ComputerName,

    [parameter(Mandatory=$false, ParameterSetName='RunWithPowerShellContextMenu')]
    [parameter(Mandatory=$true, ParameterSetName='CallFromCommandLine')]
    [UInt16] $Port
)

function Assert-AdministrativePrivileges([bool] $CalledFromRunWithPowerShellMenu)
{
    $isAdministrator = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

    if ($isAdministrator)
    {
        if (!$CalledFromRunWithPowerShellMenu -and !$CallFromCommandLine)
        {
            # Must call itself asking for obligatory parameters
            & "$PSCommandPath" @script:PSBoundParameters -CallFromCommandLine
            Exit
        }
    }
    else
    {
        if (!$CalledFromRunWithPowerShellMenu -and !$CallFromCommandLine)
        {
            $serializedParams = [Management.Automation.PSSerializer]::Serialize($script:PSBoundParameters)

            $scriptStr = @"
                `$serializedParams = '$($serializedParams -replace "'", "''")'

                `$params = [Management.Automation.PSSerializer]::Deserialize(`$serializedParams)

                & "$PSCommandPath" @params -CallFromCommandLine
"@

            $scriptBytes = [System.Text.Encoding]::Unicode.GetBytes($scriptStr)
            $encodedCommand = [Convert]::ToBase64String($scriptBytes)

            # If this script is called from another one, the execution flow must wait for this script to finish.
            Start-Process -FilePath 'powershell' -ArgumentList "-ExecutionPolicy Bypass -NoProfile -EncodedCommand $encodedCommand" -Verb 'RunAs' -Wait
        }
        else
        {
            # When you use the "Run with PowerShell" feature, the Windows PowerShell console window appears only briefly.
            # The NoExit option makes the window stay visible, so the user can see the script result.
            Start-Process -FilePath 'powershell' -ArgumentList "-ExecutionPolicy Bypass -NoProfile -NoExit -File ""$PSCommandPath""" -Verb 'RunAs'
        }

        Exit
    }
}

function Get-UserParameters()
{
    [string] $script:ComputerName = [Microsoft.VisualBasic.Interaction]::InputBox('Enter a computer name:', 'Testing Network Connection')

    if ($script:ComputerName -eq '')
    {
        throw 'The computer name is required.'
    }

    [string] $inputPort = [Microsoft.VisualBasic.Interaction]::InputBox('Enter a TCP port:', 'Testing Network Connection')

    if ($inputPort -ne '')
    {
        if (-not [UInt16]::TryParse($inputPort, [ref]$script:Port))
        {
            throw "The value '$inputPort' is invalid for a port number."
        }
    }
    else
    {
        throw 'The TCP port is required.'
    }
}

# $MyInvocation.Line is empty in the second script execution, when a new powershell session
# is started for this script via Start-Process with the -File option.
$calledFromRunWithPowerShellMenu = $MyInvocation.Line -eq '' -or $MyInvocation.Line.StartsWith('if((Get-ExecutionPolicy')

Assert-AdministrativePrivileges $calledFromRunWithPowerShellMenu

# Necessary for InputBox
[System.Reflection.Assembly]::Load('Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a') | Out-Null

if ($calledFromRunWithPowerShellMenu)
{
    Get-UserParameters
}

# ... script code
Test-NetConnection -ComputerName $ComputerName -Port $Port

3

จำนวนคำตอบที่นี่ใกล้เคียง แต่ก็มีงานมากกว่าที่จำเป็นเล็กน้อย

สร้างทางลัดไปยังสคริปต์ของคุณและกำหนดค่าเป็น "Run as Administrator":

  • สร้างทางลัด
  • คลิกขวาที่ทางลัดแล้วเปิด Properties...
  • แก้ไขTargetจาก<script-path>เป็นpowershell <script-path>
  • คลิกAdvanced...และเปิดใช้งานRun as administrator

2

อีกวิธีที่ง่ายกว่าคือคุณสามารถคลิกขวาที่ "C: \ Windows \ System32 \ cmd.exe" และเลือก "Run as Administrator" จากนั้นคุณสามารถเรียกใช้แอปใด ๆ ในฐานะผู้ดูแลระบบโดยไม่ต้องใส่รหัสผ่านใด ๆ


2

ฉันใช้วิธีแก้ปัญหาด้านล่าง มันจัดการ stdout / stderr ผ่านคุณสมบัติการถอดเสียงและส่งรหัสทางออกอย่างถูกต้องไปยังกระบวนการหลัก คุณต้องปรับเปลี่ยนเส้นทาง / ชื่อไฟล์

If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
{ 
  echo "* Respawning PowerShell child process with elevated privileges"
  $pinfo = New-Object System.Diagnostics.ProcessStartInfo
  $pinfo.FileName = "powershell"
  $pinfo.Arguments = "& '" + $myinvocation.mycommand.definition + "'"
  $pinfo.Verb = "RunAs"
  $pinfo.RedirectStandardError = $false
  $pinfo.RedirectStandardOutput = $false
  $pinfo.UseShellExecute = $true
  $p = New-Object System.Diagnostics.Process
  $p.StartInfo = $pinfo
  $p.Start() | Out-Null
  $p.WaitForExit()
  echo "* Child process finished"
  type "C:/jenkins/transcript.txt"
  Remove-Item "C:/jenkins/transcript.txt"
  Exit $p.ExitCode
} Else {
  echo "Child process starting with admin privileges"
  Start-Transcript -Path "C:/jenkins/transcript.txt"
}

# Rest of your script goes here, it will be executed with elevated privileges

สิ่งนี้จะสูญเสียการโต้แย้งทั้งหมด
Guillermo Prandi

2

นี่คือวิธีการรันคำสั่ง powershell แบบยกระดับและรวบรวมแบบฟอร์มเอาต์พุตภายในไฟล์แบตช์ windows ในคำสั่งเดียว (เช่นไม่ได้เขียนสคริปต์ ps1 powershell)

powershell -Command 'Start-Process powershell -ArgumentList "-Command (Get-Process postgres | Select-Object Path | Select-Object -Index 0).Path | Out-File -encoding ASCII $env:TEMP\camp-postgres.tmp" -Verb RunAs'

ด้านบนคุณจะเห็นฉันเปิดใช้ PowerShell เป็นครั้งแรกด้วยการยกระดับพรอมต์จากนั้นขอให้เปิดใช้ PowerShell อื่น (เชลล์ย่อย) เพื่อเรียกใช้คำสั่ง


1

ด้านบนของคำตอบของ Shay Levy ให้ทำตามการตั้งค่าด้านล่าง (เพียงครั้งเดียว)

  1. เริ่ม PowerShell ด้วยสิทธิ์ของผู้ดูแลระบบ
  2. ติดตามคำถาม Stack Overflow PowerShell กล่าวว่า“ การเรียกใช้สคริปต์ถูกปิดใช้งานในระบบนี้” .
  3. วางไฟล์. ps1 ของคุณลงในPATHโฟลเดอร์ใด ๆ โฟลเดอร์ Windows \ System32

หลังจากการตั้งค่า:

  1. กดWin+R
  2. วิงวอน powershell Start-Process powershell -Verb runAs <ps1_file>

ตอนนี้คุณสามารถรันทุกอย่างในบรรทัดคำสั่งเดียว การทำงานข้างต้นใน Windows 8 Basic 64- บิต


1

วิธีที่เชื่อถือได้มากที่สุดที่ฉันพบคือห่อในไฟล์. bat ที่ยกระดับเอง:

@echo off
NET SESSION 1>NUL 2>NUL
IF %ERRORLEVEL% EQU 0 GOTO ADMINTASKS
CD %~dp0
MSHTA "javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%~nx0', '', '', 'runas', 0); close();"
EXIT

:ADMINTASKS

powershell -file "c:\users\joecoder\scripts\admin_tasks.ps1"

EXIT

. bat จะตรวจสอบว่าคุณเป็นผู้ดูแลระบบอยู่แล้วและเปิดใช้งานสคริปต์อีกครั้งในฐานะผู้ดูแลระบบหากจำเป็น นอกจากนี้ยังป้องกันภายนอก "cmd" จากการเปิดหน้าต่างที่มีพารามิเตอร์ที่ 4 ของชุดShellExecute()0


คำตอบที่ดี แต่ฉันลองแล้วใช้ไม่ได้ (และออกจากบรรทัดคำสั่งที่ฉันเรียกมัน) ฉันแก้ไขวิธีนี้: ฉันเปลี่ยนอันแรกEXITเป็น a GOTO :EOFและลบอันที่สอง นอกจากนี้cd %~dp0ควรจะเป็นและวางคำสั่งแรกหลังจากที่cd /d %~dp0 @echo offวิธีนี้คุณไม่จำเป็นต้องใช้เส้นทางที่แน่นอนของทั้งสองเพียงแค่วางไว้ในโฟลเดอร์เดียวกันว่า.ps1 หากคุณต้องการที่จะเห็นผลการเปลี่ยนแปลงพารามิเตอร์ที่.bat 4 1
cdlvcdlv

คุณใช้ O / S และเวอร์ชั่นใด
โจ Coder

Windows 7 SP1 Ultimate ฉันมีระบบใน C: แต่ยังรวมถึงข้อมูลและแอพพลิเคชั่นแบบพกพาใน D: ส่วนใหญ่ (และไดรฟ์อื่น ๆ อีกหลายตัว) โดยวิธีการ ... จะเกิดอะไรขึ้นถ้าโปรแกรม / สคริปต์ใช้พารามิเตอร์? สิ่งที่จะเป็นmshtaคำสั่ง?
cdlvcdlv

ฉันคิดว่าคุณอาจมีข้อผิดพลาดในการทดสอบของคุณเพราะสคริปต์ทำงานได้ดี cmdยังไงก็ตามมันถูกออกแบบมาเพื่อออกจากกระบวนการเรียกดังนั้นมันจึงไม่ใช่ "แก้ไข" แต่ฉันดีใจที่คุณสามารถแก้ไขได้ตามความต้องการของคุณ
โจ Coder

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

0

ฉันไม่เคยเห็นวิธีของฉันมาก่อนเลยลองใช้ดู มันง่ายกว่าที่จะติดตามและมีขนาดเล็กกว่ามาก:

if([bool]([Security.Principal.WindowsIdentity]::GetCurrent()).Groups -notcontains "S-1-5-32-544") {
    Start Powershell -ArgumentList "& '$MyInvocation.MyCommand.Path'" -Verb runas
    }

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

คำตอบเหล่านี้เกือบทั้งหมดเป็นรูปแบบที่แตกต่างกันในวิธีการที่ได้รับความนิยมอย่างมากของ Ben Armstrong ของไมโครซอฟท์ในการทำมันให้สำเร็จในขณะที่ไม่เข้าใจสิ่งที่กำลังทำจริง ๆ


0

ในการผนวกเอาท์พุทของคำสั่งต่อท้ายชื่อไฟล์ข้อความซึ่งรวมถึงวันที่ปัจจุบันคุณสามารถทำสิ่งนี้:

$winupdfile = 'Windows-Update-' + $(get-date -f MM-dd-yyyy) + '.txt'
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -Command `"Get-WUInstall -AcceptAll | Out-File $env:USERPROFILE\$winupdfile -Append`"" -Verb RunAs; exit } else { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -Command `"Get-WUInstall -AcceptAll | Out-File $env:USERPROFILE\$winupdfile -Append`""; exit }

0

นี่คือการชี้แจง ...

หนังสือรับรอง powershell RUNAS / SAVECRED "ไม่ปลอดภัย" ลองแล้วจะเพิ่มข้อมูลประจำตัวของผู้ดูแลระบบและรหัสผ่านลงในแคชข้อมูลรับรองและสามารถใช้ที่อื่น OOPS! หากคุณทำสิ่งนี้ฉันขอแนะนำให้คุณตรวจสอบและลบรายการ

ตรวจสอบโปรแกรมหรือรหัสของคุณเนื่องจากนโยบายของ Microsoft คือคุณไม่สามารถมีรหัสผู้ใช้และผู้ดูแลระบบผสมกันใน blob รหัสเดียวกันโดยไม่มี UAC (จุดเข้าใช้งาน) เพื่อเรียกใช้โปรแกรมในฐานะผู้ดูแลระบบ นี่จะเป็น sudo (สิ่งเดียวกัน) บน Linux

UAC มี 3 ประเภทไม่ต้องแจ้งให้หรือจุดเริ่มต้นที่สร้างขึ้นในรายการของโปรแกรม มันไม่ยกระดับโปรแกรมดังนั้นหากไม่มี UAC และต้องการผู้ดูแลระบบก็จะล้มเหลว UAC แม้ว่าจะเป็นข้อกำหนดของผู้ดูแลระบบ แต่ก็ป้องกันการเรียกใช้โค้ดโดยไม่ต้องมีการตรวจสอบสิทธิ์และป้องกันไม่ให้สถานการณ์รหัสผสมทำงานในระดับผู้ใช้


นี่ควรเป็นข้อคิดเห็นไม่ใช่คำตอบสำหรับคำถาม (เพียงวิธีการทำงานของฟอรั่มเนื้อหาของคุณมีประโยชน์ แต่ไม่ใช่วิธีแก้ปัญหา)
bgmCoder

-2

ปรากฎว่ามันง่ายเกินไป สิ่งที่คุณต้องทำคือเรียกใช้ cmd ในฐานะผู้ดูแลระบบ จากนั้นพิมพ์explorer.exeและกด Enter ที่เปิดขึ้นWindows Explorer ตอนนี้คลิกขวาที่สคริปต์ PowerShell ของคุณที่คุณต้องการเรียกใช้เลือก "รันด้วย PowerShell" ซึ่งจะเปิดใช้งานใน PowerShell ในโหมดผู้ดูแลระบบ

อาจขอให้คุณเปิดใช้งานนโยบายเพื่อเรียกใช้พิมพ์ Y และกด Enter ตอนนี้สคริปต์จะทำงานใน PowerShell ในฐานะผู้ดูแลระบบ ในกรณีที่มีสีแดงทั้งหมดแสดงว่านโยบายของคุณยังไม่ได้รับผลกระทบ จากนั้นลองอีกครั้งและควรใช้งานได้ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.