ยกระดับ UAC ผ่านไฟล์. bat


10

ตรงไปตรงมาสวยที่ฉันมีปัญหาในการหาคำตอบ

ก่อนหน้านี้ serverfault ช่วยฉันด้วยการหาวิธีในการอัพเดท Windows โดยอัตโนมัติโดยไม่ต้องใช้ WSUS มันใช้งานได้ยอดเยี่ยม แต่เมื่อต้องการเรียกใช้ผ่านเครือข่ายคุณต้องติดตั้งไดรฟ์ที่ใช้ร่วมกันก่อน นั่นเป็น XP ที่ค่อนข้างง่ายเพราะคุณเพิ่งติดตั้งไดรฟ์และรันตัวอัปเดต

อย่างไรก็ตามใน Vista และ W7 สิ่งนี้ทั้งหมดจะต้องทำด้วยสิทธิ์ยกระดับเพื่อให้ทำงานได้อย่างถูกต้อง บัญชี UAC ไม่สามารถมองเห็นไดรฟ์เครือข่ายที่ติดตั้งโดยผู้ใช้ปกติดังนั้นเพื่อให้ทุกอย่างทำงานได้ฉันต้องติดตั้งการแชร์ผ่านnet useจากเชลล์ที่เลื่อนระดับ ฉันต้องการติดตั้งการแชร์นี้โดยอัตโนมัติและเปิดตัว updater ผ่านไฟล์. bat อย่างง่าย

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

เนื่องจากคอมพิวเตอร์เหล่านี้ไม่ได้เป็นของเราฉันไม่สามารถวางใจในสิ่งใด ๆ เช่น Powershell ที่ติดตั้งอยู่ได้ดังนั้นจึงกำหนดกฎเกณฑ์การแก้ปัญหาต่าง ๆ ตามบรรทัดเหล่านั้นและต้องพึ่งพาสิ่งต่าง ๆ ที่จะรวมอยู่ในการติดตั้ง RTM Vista ฉันหวังว่าฉันไม่มีอะไรที่ชัดเจนที่นี่เป็นส่วนใหญ่ :)

คำตอบ:


8

http://technet.microsoft.com/en-us/magazine/2007.06.utilityspotlight.aspx

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

หรือสร้าง SFX ของคุณโดยใช้เครื่องมือ SFX ที่คุณโปรดปรานและใช้เครื่องมือยกระดับด้านบน


ฉันจะจำเรื่องนี้ไว้ แต่อีกครั้งฉันพยายามหลีกเลี่ยงการติดตั้งสิ่งใดเป็นพิเศษเนื่องจากเครื่องเหล่านี้เป็นของบุคคลที่สาม
jslaker

ฉันเชื่อว่าคุณสามารถใช้งานได้โดยไม่ต้องติดตั้งเพียงแค่แพ็คเกจข้างไฟล์แบตช์ของคุณ
ta.speot.is

มีไฟล์หลายไฟล์ในการดาวน์โหลด แต่ดูเหมือนว่าทั้งหมดที่คุณต้องการสำหรับความต้องการของคุณจะเป็นelevate.cmdและelevate.vbs
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

ถ้าฉันสามารถทำสิ่งนี้ทั้งหมดแบบสแตนด์อโลน / แบบพกพามันอาจทำงานได้ ฉันจะดูอย่างใกล้ชิดเมื่อฉันมีเวลามากขึ้นในภายหลังในวันนี้
jslaker

ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
Mark Henderson

4

หากคุณพร้อมที่จะแปลงเป็น PowerShell สิ่งนี้จะทำง่ายกว่ามาก นี่คือElevate-Process.ps1สคริปต์ " " ของฉัน(โดยมีsuชื่อแทนในโปรไฟล์ของฉัน):

# Updated elevate function that does not need Elevate PowerToys
# From http://devhawk.net/2008/11/08/My+ElevateProcess+Script.aspx


$psi = new-object System.Diagnostics.ProcessStartInfo
$psi.Verb = "runas"

# If passed multiple commands, or one (that isn't a folder) then execute that command:
if (($args.Length -gt 1) -or (($args.length -eq 1) -and -not (test-path $args[0] -pathType Container))) {

    $file, [string]$arguments = $args;
    $psi.FileName = $file  
    $psi.Arguments = $arguments
    [System.Diagnostics.Process]::Start($psi) | out-null
    return
}

# If from console host, handle case of one argyment that is
# a folder, to start in that folder. Otherwise start in current folder.
if ($host.Name -eq 'ConsoleHost') {
    $psi.FileName = (Get-Command -name "PowerShell").Definition
    if ($args.length -eq 0) {
        $psi.Arguments = "-NoExit -Command &{set-location '" + (get-location).Path + "'}"
    } else {
        $psi.Arguments = "-NoExit -Command &{set-location '" + (resolve-path $args[0]) + "'}"
    }
    [System.Diagnostics.Process]::Start($psi) | out-null
    return
}

# Otherwise this is some other host (which cannot be assumed to take parameters).
# So simplely launch elevated.
$psi.FileName = [system.diagnostics.process]::getcurrentprocess().path
$psi.Arguments = ""
[System.Diagnostics.Process]::Start($psi) | out-null

การตรวจจับการยกระดับยังสามารถทำได้ใน PSH (เช่นคุณสามารถตรวจสอบระดับความสูงแล้วยกระดับหากจำเป็น):

$wid=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$prp=new-object System.Security.Principal.WindowsPrincipal($wid)
$adm=[System.Security.Principal.WindowsBuiltInRole]::Administrator
$IsAdmin=$prp.IsInRole($adm)
if ($IsAdmin) {
  $host.UI.RawUI.Foregroundcolor="Red"
  write-host "`n** Elevated Session **`n" -foreground $_errorColour -background $_errorBackound
}

ฉันคิดว่า Powershell สามารถทำสิ่งนี้ได้ แต่อีกครั้งฉันไม่สามารถวางใจได้ในการติดตั้ง Powershell และต้องการสิ่งที่เป็นไฟและลืมไปได้
jslaker

@jslaker: นั่นอาจเป็นปัญหากับ Vista / 2008 แต่ PSH นั้นมาพร้อมกับ Win7 / 2008R2 เพื่อให้ง่ายขึ้น ในสถานการณ์ขององค์กรนี่อาจเป็นแรงผลักดันที่จะออกมาหรือไม่?
Richard

มันไม่ใช่สถานการณ์ขององค์กร มีคำถามเดิมอีกข้อที่ฉันเชื่อมโยง แต่รุ่นสั้น ๆ คือเราเป็นร้านซ่อมเครื่องคอมพิวเตอร์และนี่คือพื้นฐานทั้งหมดที่พยายามแก้ไขใบอนุญาต WSUS ห้ามไม่ให้คุณใช้ WSUS เพื่อปรับใช้การปรับปรุงกับเครื่องที่ไม่ได้ อนุญาตให้องค์กรของคุณ เหล่านี้เป็นเครื่องลูกค้าที่สามารถใช้งานอะไรก็ได้จาก XP RTM ขึ้นไป นี่คือเหตุผลที่ฉันไม่สามารถพึ่งพาสิ่งที่ติดตั้งที่จะไม่รวมอยู่ในการติดตั้ง RTM ของระบบปฏิบัติการใด ๆ
jslaker

หากคุณไม่สามารถพึ่งพา Powershell ที่ติดตั้งอยู่ให้ตรวจสอบคำตอบที่ฉันได้รับด้านล่าง
Matt

3

นี่คือสคริปต์ตัวอย่างที่ฉันคิดไว้ฉันหวังว่ามันจะช่วยผู้อื่น มันเป็นไฟล์ค้างคาวที่พร้อมท์ให้ผู้ใช้งานอนุญาตและเพิ่มระดับเอง มันท่อ vbscript ซึ่งก่อให้เกิดการพร้อมท์ UAC แล้วเรียกใช้ไฟล์ค้างคาวอีกครั้งยกระดับ ... http://jagaroth.livejournal.com/63875.html


2

นี่คือสิ่งที่คุณต้องการ: http://sites.google.com/site/eneerge/home/BatchGotAdmin


1
สคริปต์นี้มีข้อบกพร่องเล็กน้อยไม่ได้ส่งต่อพารามิเตอร์ใด ๆ เพียงใส่คำสั่งเพื่อเรียกสคริปต์ของคุณเช่นนี้: echo UAC.ShellExecute "% ~ s0", "% *", "", "runas", 1 >> "% temp% \ getadmin.vbs"
SvenS

1

FusionInventory.org เป็นโซลูชันโอเพนซอร์ซที่ใช้ในร้านซ่อมเล็ก ๆ เป็นส่วนใหญ่ อาจเป็นเหมือนตัวอัพเดต windows ที่ควบคุมจากระยะไกล


0

ไม่มีวิธีแก้ปัญหาเหล่านั้นที่ทำงานกับไฟล์. cmd ที่ต้องระวังพารามิเตอร์บรรทัดคำสั่ง วางสิ่งนี้ไว้ที่จุดเริ่มต้นของไฟล์. cmd และปัญหาทั้งหมดของคุณจะได้รับการแก้ไข (สิ่งนี้มีไว้สำหรับคนที่กำลังอ่านหัวข้อนี้ในอนาคต [ฉันได้ทดสอบสิ่งนี้บน windows XP, 7 Vista และ 8; x86 + x64]):

@echo off
NET SESSION >nul 2>&1 && goto noUAC
title.
set n=%0 %*
set n=%n:"=" ^& Chr(34) ^& "%
echo Set objShell = CreateObject("Shell.Application")>"%tmp%\cmdUAC.vbs"
echo objShell.ShellExecute "cmd.exe", "/c start " ^& Chr(34) ^& "." ^& Chr(34) ^& " /d " ^& Chr(34) ^& "%CD%" ^& Chr(34) ^& " cmd /c %n%", "", "runas", ^1>>"%tmp%\cmdUAC.vbs"
echo Not Admin, Attempting to elevate...
cscript "%tmp%\cmdUAC.vbs" //Nologo
del "%tmp%\cmdUAC.vbs"
exit /b
:noUAC

::-----Normal Batch Starts Here---------------------

0

ดังที่ @emilio กล่าวว่าสคริปต์นั้นใช้ได้ แต่ไม่ยอมรับอาร์กิวเมนต์ใด ๆ นี่คือสคริปต์ที่ปรับเปลี่ยนเพื่อให้เข้ากันได้กับอาร์กิวเมนต์:

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo args = "" >> "%temp%\getadmin.vbs"
    echo For Each strArg in WScript.Arguments >> "%temp%\getadmin.vbs"
    echo args = args ^& strArg ^& " "  >> "%temp%\getadmin.vbs"
    echo Next >> "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", args, "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs" %*
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------

0

หากคุณไม่สามารถพึ่งพา Powershell ที่ติดตั้งอยู่คุณสามารถใช้โซลูชันนี้ใน StackOverflow:

ยกระดับอัตโนมัติด้วย UAC โดยใช้ไฟล์แบตช์

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


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