UAC .bat dosyası üzerinden yükseltiliyor mu?


10

Cevap bulmakta zorlandığım oldukça basit bir soru.

serverfault daha önce WSUS kullanmadan Windows güncellemelerini otomatikleştirmenin bir yolunu bulmamda bana yardımcı oldu . Fevkalade çalışıyor, ancak ağ üzerinden çalıştırmak için önce paylaşılan bir sürücü takmanız gerekiyor. Sürücüyü bağlayıp güncelleyiciyi çalıştırdığınız için bu oldukça basit bir XP.

Vista ve W7'de, bunların hepsi doğru çalışması için yükseltilmiş ayrıcalıklarla yapılmalıdır. UAC hesabı, normal kullanıcı tarafından monte edilen ağ sürücülerini göremez, bu nedenle her şeyin çalışmasını sağlamak için paylaşımı net useyükseltilmiş bir kabuktan bağlamam gerekir. Bu paylaşımı otomatikleştirmeyi ve güncelleyiciyi basit bir .bat dosyasıyla başlatmayı otomatikleştirmek istiyorum.

Muhtemelen herkese .bat dosyasında "Yönetici Olarak Çalıştır" ı sağ tıklatmasını söyleyebilirim, ancak işleri olabildiğince basit tutmak ve .bat'ın otomatik olarak kullanıcının ayrıcalıklarını yükseltmesini istemesini istiyorum.

Bu bilgisayarlar bize ait olmadığından, yüklü olan Powershell gibi hiçbir şeye güvenemiyorum, bu yüzden bu hatlar boyunca herhangi bir çözümü yönetir ve RTM Vista kurulumuna dahil edilecek şeylere güvenmek zorundadır. Çoğunlukla burada bariz bir şeyi kaçırmayı umuyorum. :)

Yanıtlar:


8

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

EDIT: Müşteriye çalıştırmak için tek bir dosya veriyorsanız, neden WinRAR ile kendi kendine ayıklanan bir RAR oluşturmuyorsunuz ve SFX seçeneklerinde "Yönetici İste" bayrağını ayarlamıyorsunuz? Bu sadece 1 dosya sınırınızı ortadan kaldırır, ihtiyacınız olan tüm kaynaklara sahip olabilirsiniz.

Alternatif olarak, favori SFX aracınızı kullanarak SFX'inizi yapın ve yukarıdaki yükseltme araçlarını kullanın.


Bunu aklımda tutacağım, ama yine de, bu makineler üçüncü taraflara ait olduğu için ekstra bir şey yüklemekten kaçınmaya çalışıyorum.
jslaker

Onları yüklemeden kullanabileceğinizi düşünüyorum, sadece toplu iş dosyanızın yanında paketleyin.
ta.speot.

İndirmede birkaç dosya var, ancak gereksiniminiz için ihtiyacınız olan her şey olacak gibi görünüyor elevate.cmdveelevate.vbs
sonraki duyuruya kadar duraklatıldı.

Tüm bunları oldukça bağımsız / taşınabilir bir şey olarak paketleyebilirsem işe yarayabilir. Bugün biraz daha zamanım olduğunda ona daha yakından bakacağım.
jslaker

Bu teorik olarak soruyu cevaplayabilse de , cevabın temel kısımlarını buraya dahil etmek ve referans için bağlantı sağlamak tercih edilir.
Mark Henderson

4

PowerShell'e dönüştürmeye hazırsanız, bunu yapmak çok daha kolaydır. Bu benim " Elevate-Process.ps1" betiğim ( suprofilimde takma ad olarak):

# 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

Yükseltildiğinin tespiti PSH'de de yapılabilir (böylece yükselmeyi kontrol edebilir ve gerekirse yükseltebilirsiniz):

$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'in bunu yapabileceğini düşündüm, ama yine de, Powershell'in kurulmasına güvenemiyorum ve ateş gibi bir şeye ihtiyacım var ve mümkün olduğunca unutabiliyorum.
jslaker

@jslaker: Vista / 2008 ile ilgili kesinlikle sorun olabilir. Ancak PSH, Win7 / 2008R2 ile birlikte geliyor, böylece daha kolay olmalı. Kurumsal bir durumda, bu bir çözüm elde etme dürtüsü olabilir mi?
Richard

Bu kurumsal bir durum değil. Bağladığım orijinal soruda daha fazlası var, ancak kısa sürüm bir PC onarım mağazası olduğumuz ve temelde bu, WSUS lisansının, güncellemeleri dağıtmak için WSUS'yi kullanmanıza izin vermemesi konusunda geçici olarak çalışmaya çalışıyor kuruluşunuza lisanslı. Bunların hepsi XP RTM'den itibaren her şeyi çalıştırabilecek müşteri makineleridir. Bu yüzden, herhangi bir işletim sisteminin RTM kurulumuna dahil edilmeyen hiçbir şeye güvenmiyorum.
jslaker

Yüklenmekte olan Powershell'e güvenemiyorsanız, aşağıda verdiğim yanıta bakın.
Matt

3

işte geldiğim örnek bir senaryo, umarım başkalarına yardımcı olur. Kullanıcıdan izin isteyen ve daha sonra kendini yükselten bir yarasa dosyasıdır. UAC istemini tetikleyen ve daha sonra yükseltilmiş yarasa dosyasını yeniden çalıştıran bazı vbscript'leri çıkarır ... http://jagaroth.livejournal.com/63875.html



1

FusionInventory.org çoğunlukla küçük tamir atölyeleri tarafından kullanılan açık kaynaklı bir çözümdür. Kişisel uzaktan kumandalı windows güncelleyici gibi olabilir.


0

Bu çözümlerin hiçbiri, komut satırı parametrelerinin farkında olması gereken bir .cmd dosyası için çalışmaz. Bunu .cmd dosyasının en başına koyun, tüm sorunlarınız çözülecektir. (Bu, bu konuya göz atan gelecekteki insanlar içindir [Bunu Windows XP, 7 Vista ve 8'de test ettim; 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'nun dediği gibi, bu komut dosyası iyidir, ancak herhangi bir argümanı kabul etmez. Burada değiştirilen komut dosyası argümanlarla uyumlu olacak:

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.