.bat 파일을 통해 UAC를 높이시겠습니까?


10

대답을 찾는 데 어려움을 겪는 매우 간단한 것입니다.

serverfault는 이전에 WSUS를 사용하지 않고 Windows 업데이트를 자동화하는 방법을 찾는 데 도움이되었습니다 . 환상적으로 작동하지만 네트워크를 통해 실행하려면 먼저 공유 드라이브를 마운트해야합니다. 드라이브를 마운트하고 업데이터를 실행하기 때문에 매우 간단한 XP입니다.

그러나 Vista와 W7에서는이 모든 것이 제대로 작동하려면 높은 권한으로 수행되어야합니다. UAC 계정은 일반 사용자가 마운트 한 네트워크 드라이브를 볼 수 없으므로 모든 것이 작동 net use하려면 에스컬레이션 된 쉘에서 공유를 마운트해야합니다 . 이 공유를 마운트하고 간단한 .bat 파일을 통해 업데이터를 시작하고 싶습니다.

.bat 파일에서 "관리자 권한으로 실행"을 마우스 오른쪽 단추로 클릭하도록 모든 사람에게 지시 할 수는 있지만 가능한 한 간단하게 유지하고 .bat가 자동으로 사용자에게 권한을 에스컬레이션하도록 요청하고 싶습니다.

이 컴퓨터는 우리에게 속해 있지 않기 때문에 Powershell과 같은 것을 믿을 수 없으므로 해당 라인을 따르는 모든 솔루션은 RTM Vista 설치에 포함될 것들에 거의 의존해야합니다. 나는 여기에 분명한 것이 빠져 있기를 바라고 있습니다. :)

답변:


8

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

편집 : 고객에게 실행할 단일 파일을 제공하는 경우 WinRAR을 사용하여 자동 압축 풀기 RAR을 생성하고 SFX 옵션에서 "관리자 필요"플래그를 설정하십시오. 이렇게하면 파일이 1 개로 제한되어 필요한 모든 리소스를 확보 할 수 있습니다.

또는 선호하는 SFX 도구를 사용하여 SFX를 만들고 위의 높은 도구를 사용하십시오.


나는 이것을 명심할 것이지만, 다시 말하지만,이 기계가 제 3 자에 속하기 때문에 추가 설치를 피하려고합니다.
jslaker

나는 당신이 그것들을 설치하지 않고 사용할 수 있다고 생각합니다. 배치 파일 옆에 포장하십시오.
ta.speot.is는

이 다운로드에 여러 파일이 있지만, 그것은 귀하의 요구 사항이 될 것이다 당신이 필요로하는 것 모든 모양 elevate.cmdelevate.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

글쎄, 그것은 기업 상황이 아닙니다. 원래 질문에 더 많은 링크가 있지만 짧은 버전은 우리가 PC 수리점이라는 것입니다. 이것은 기본적으로 WSUS 라이센스가 WSUS를 사용하여 업데이트되지 않은 컴퓨터에 업데이트를 배포하는 것을 금지한다는 것입니다. 조직에 라이센스가 부여되었습니다. XP RTM부터 무엇이든 실행할 수있는 모든 고객 컴퓨터입니다. 그렇기 때문에 특정 OS의 RTM 설치에 포함되지 않은 설치 대상에 실제로 의존 할 수없는 것입니다.
jslaker

설치중인 Powershell에 의존 할 수없는 경우 아래에 제공된 답변을 확인하십시오.
Matt

3

다음은 내가 생각해 낸 예제 스크립트입니다. 다른 사람들에게 도움이되기를 바랍니다. 사용자에게 권한을 묻는 메시지를 표시 한 다음 자체적으로 에스컬레이션하는 bat 파일입니다. UAC 프롬프트를 트리거 한 박쥐 파일을 다시 실행하는 vbscript를 파이프 아웃합니다 ... http://jagaroth.livejournal.com/63875.html



1

FusionInventory.org는 소규모 수리점에서 주로 사용하는 오픈 소스 솔루션입니다. 그것은 당신의 개인 원격 제어 윈도우 업데이터처럼 될 수 있습니다.


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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.