Nâng cao UAC qua tập tin .bat?


10

Khá đơn giản mà tôi gặp khó khăn khi tìm câu trả lời.

serverfault trước đây đã giúp tôi tìm cách tự động hóa các bản cập nhật Windows mà không cần sử dụng WSUS. Nó hoạt động rất tuyệt vời, nhưng để chạy nó qua mạng, trước tiên bạn phải gắn một ổ đĩa chung. Đó là XP khá đơn giản vì bạn chỉ cần gắn ổ đĩa và chạy trình cập nhật.

Tuy nhiên, trên Vista và W7, tất cả điều này phải được thực hiện với các đặc quyền nâng cao để hoạt động chính xác. Tài khoản UAC không thể thấy các ổ đĩa mạng được gắn bởi người dùng thông thường, vì vậy để mọi thứ hoạt động, tôi phải gắn kết chia sẻ thông qua net usetừ một vỏ được leo thang. Tôi muốn tự động gắn kết chia sẻ này và khởi chạy trình cập nhật thông qua tệp .bat đơn giản.

Tôi có thể chỉ cần hướng dẫn mọi người nhấp chuột phải vào "Chạy với tư cách Quản trị viên" trên tệp .bat, nhưng tôi muốn giữ mọi thứ đơn giản nhất có thể và để .bat tự động nhắc người dùng leo thang đặc quyền của họ.

Vì các máy tính này không thuộc về chúng tôi, tôi không thể tin tưởng vào bất cứ thứ gì như Powershell đang được cài đặt, do đó, sẽ loại bỏ mọi giải pháp dọc theo các dòng đó và gần như phải dựa vào những thứ sẽ có trong bản cài đặt RTM Vista. Tôi hy vọng tôi hầu như thiếu một cái gì đó rõ ràng ở đây. :)

Câu trả lời:


8

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

EDIT: Nếu bạn đang cung cấp cho khách hàng một tệp duy nhất để chạy, tại sao không tạo RAR tự giải nén bằng WinRAR và đặt cờ "Yêu cầu quản trị viên" trong các tùy chọn SFX? Điều này miễn cho bạn giới hạn chỉ có 1 tệp, bạn có thể có tất cả các tài nguyên bạn cần.

Hoặc tạo SFX của bạn bằng công cụ SFX yêu thích của bạn và sử dụng các công cụ nâng cao ở trên.


Tôi sẽ ghi nhớ điều này, nhưng, một lần nữa, tôi đang cố gắng tránh cài đặt thêm bất cứ thứ gì vì những máy này thuộc về bên thứ ba.
jslaker

Tôi tin rằng bạn có thể sử dụng chúng mà không cần cài đặt chúng, chỉ cần gói chúng bên cạnh tệp bó của bạn.
ta.speot.is

Có một số tập tin trong việc tải xuống, nhưng có vẻ như tất cả các bạn cần cho yêu cầu của bạn sẽ được elevate.cmdelevate.vbs
Tạm dừng cho đến khi có thông báo mới.

Nếu tôi có thể đóng gói tất cả những thứ này khá độc lập / di động, nó có thể hoạt động. Tôi sẽ xem xét kỹ hơn về nó khi tôi có thêm một chút thời gian sau ngày hôm nay.
jslaker

Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Mark Henderson

4

Nếu bạn chuẩn bị chuyển đổi sang PowerShell thì việc này dễ thực hiện hơn nhiều. Đây là Elevate-Process.ps1tập lệnh " " của tôi (với subí danh trong hồ sơ của tôi):

# 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

Việc phát hiện độ cao cũng có thể được thực hiện trong PSH (do đó bạn có thể kiểm tra độ cao, sau đó nâng lên nếu cần):

$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
}

Tôi hình dung rằng Powershell có thể làm điều này, nhưng một lần nữa, tôi không thể dựa vào Powershell đang được cài đặt, và cần một cái gì đó như lửa và quên đi càng tốt.
jslaker

@jslaker: đó chắc chắn có thể là một vấn đề với Vista / 2008. Nhưng PSH được bao gồm trong Win7 / 2008R2 để việc đó trở nên dễ dàng hơn. Trong một tình huống của công ty, đây có thể là động lực để triển khai?
Richard

Vâng, đó không phải là một tình huống của công ty. Có nhiều câu hỏi ban đầu mà tôi đã liên kết, nhưng phiên bản ngắn là chúng tôi là cửa hàng sửa chữa PC và về cơ bản, tất cả đều cố gắng giải quyết rằng giấy phép WSUS cấm bạn sử dụng WSUS để triển khai các bản cập nhật cho các máy không cấp phép cho tổ chức của bạn. Đây là tất cả các máy khách hàng có thể chạy bất cứ thứ gì từ XP RTM trở lên. Đây là lý do tại sao tôi không thể thực sự dựa vào bất cứ thứ gì được cài đặt sẽ không được bao gồm trong bản cài đặt RTM của bất kỳ HĐH nào.
jslaker

Nếu bạn không thể tin tưởng vào Powershell đang được cài đặt, hãy xem câu trả lời tôi đã đưa ra dưới đây.
Matt

3

Đây là một kịch bản ví dụ tôi đã đưa ra, tôi hy vọng nó sẽ giúp người khác. Đó là một tập tin dơi nhắc người dùng cho phép và sau đó tự leo thang. Nó loại bỏ một số vbscript kích hoạt dấu nhắc UAC và sau đó chạy lại tệp bat nâng lên ... http://jagaroth.livejournal.com/63875.html


2

Đây là những gì bạn cần: http://sites.google.com/site/eneerge/home/BatchGotAdmin


1
Kịch bản này có một lỗi nhỏ, nó không chuyển tiếp bất kỳ tham số nào. Chỉ cần đặt chúng vào lệnh để gọi tập lệnh của bạn như thế này: echo UAC.ShellExecute "% ~ s0", "% *", "", "runas", 1 >> "% temp% \ getadmin.vbs"
SvenS

1

FusionInventory.org là một giải pháp nguồn mở chủ yếu được sử dụng bởi các cửa hàng sửa chữa nhỏ. Nó có thể giống như cập nhật cửa sổ điều khiển từ xa cá nhân của bạn.


0

Không có giải pháp nào trong số đó làm việc cho tệp .cmd cần phải biết các tham số dòng lệnh. Đặt nó ở ngay đầu tập tin .cmd và tất cả các vấn đề của bạn sẽ được giải quyết. (Cái này dành cho những người tương lai đang duyệt chủ đề này [Tôi đã thử nghiệm cái này trên windows XP, 7 Vista và 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

Như @emilio đã nói, kịch bản đó ổn nhưng nó không chấp nhận bất kỳ đối số nào. Ở đây tập lệnh được sửa đổi để tương thích với các đối số:

:: 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

Nếu bạn không thể tin tưởng vào Powershell đang được cài đặt, bạn có thể sử dụng giải pháp này trên StackOverflow:

tự động nâng cao với UAC bằng tệp bó

Nó không yêu cầu bất cứ điều gì để được cài đặt và chạy ra khỏi hộp. Nếu bạn cần duy trì các đối số dòng lệnh, hãy xem xét bản cập nhật này .


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.