2016-06-21 3 views
2

Есть ли возможность иметь код возврата (возможно, Bool?), Чтобы узнать, были ли приняты или отклонены диалоговое окно UAC? Теперь я делаю это без проверки следующим образом.Коды возврата ShellExecute VBScript

Set Shell = CreateObject("Shell.Application") 
Shell.ShellExecute "wscript.exe", """" & SOME_LOG_PARSING_SCRIPT_FULLPATH_HERE & """ uac", "", "runas" 

Было бы неплохо узнать, принял ли пользователь диалог uac (если есть).

+1

Может быть не совсем дубликата, но это, кажется, весьма актуально: http://stackoverflow.com/q/ 27222097/4996248 –

+0

Я должен страдать от PEBKAC, потому что я не вижу, где его фактический ответ. Он просто вставил ручную секцию, но не ответил на вопрос OP ... на самом деле. – CDoc

+0

, может быть, это не помогает, но принятый ответ, похоже, может дать вам некоторую идею. Если нет, надейтесь, что кто-то другой даст вам лучший ответ. –

ответ

1

десятки раз сказал: basically, no, what you're asking isn't possible. Однако, есть обходной путь, который отвечает на вопрос, с высокой вероятностью хотя есть еще ненулевая вероятность ложного срабатывания. Вот проект такого решения см ниже скрипт:

  • Если повышен уже тогда ответ 100%: UAC строке не требуется.
  • В противном случае, счет повышеннойwscript.exeперед тем подсказку UAC и после это:
    • если счетчики совпадают, то UAC подсказка была вероятно отказался;
    • если счетчики отличаются тогда UAC prompt был возможно одобрено.

выше метод может потерпеть неудачу, если Повышенныеwscript.exe был асинхронно началась или закончилась в то же время ... К примеру, от сеанса RDP или Task Scheduler и т.д.

option explicit 
On Error GoTo 0 
Dim strResult: strResult = Wscript.ScriptName 

Dim objShell, svcCounter, preCounter, postCounter 
Set objShell = CreateObject("Shell.Application") 

svcCounter = 0 
preCounter = 0 
postCounter = 0 

Call TestProcess ("SVC", svcCounter, "svchost.exe") 
strResult = strResult & vbNewLine & Cstr(svcCounter) 

If svcCounter = 0 Then 
    '' elevated already 
    strResult = strResult & vbNewLine & "UAC prompt not required" 
    objShell.ShellExecute "wscript.exe" _ 
     , """" & "D:\VB_scripts\SO\37911301.vbs" & """ uac" , "", "runas", 1 
Else 
    preCounter = 0 

    Call TestProcess ("pre", preCounter, "wscript.exe") 

    ' By default, Windows Vista/7/8's UAC prompt is shown on a _secure desktop_ 
    ' suspending calling process temporarily: 
    objShell.ShellExecute "wscript.exe" _ 
     , """" & "D:\VB_scripts\SO\37911301.vbs" & """ uac" , "", "runas", 1 

    Call TestProcess ("post", postCounter, "wscript.exe") 

    strResult = strResult & vbNewLine & Cstr(preCounter) & vbTab & Cstr(postCounter) 
    If preCounter = postCounter Then 
     strResult = strResult & vbNewLine & "UAC prompt PROBABLY refused" 
    Else 
     strResult = strResult & vbNewLine & "UAC prompt PROBABLY approved" 
    End If 
End If 

Wscript.Echo strResult 
Wscript.Quit 

Sub TestProcess(byVal sStage, byRef nCounter, byVal strCap) 

    strResult = strResult & vbNewLine & sStage 
    Dim strQuery, objWMIService, colItems, objItem, sCaption, sCmdLine 
    Const wbemFlagReturnImmediately = &h10 
    Const wbemFlagForwardOnly  = &h20 

    strQuery = "SELECT * FROM Win32_Process WHERE Caption = '" & strCap & "'" 

    Set objWMIService = GetObject("winmgmts:\\" & "." & "\ROOT\CIMV2") 
    Set colItems = objWMIService.ExecQuery(strQuery _ 
      , "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly) 

    For Each objItem in colItems 
     sCaption = objItem.Caption 
     sCmdLine = objItem.CommandLine 
     if VarType(sCmdLine) = 1 Then nCounter = nCounter + 1 'Null => elevated 
     strResult = strResult & vbNewLine & sCaption 
     strResult = strResult & vbTab & objItem.ProcessId 
     strResult = strResult & vbTab & sCmdLine 
     'strResult = strResult & vbTab & VarType(sCmdLine) & vbTab & TypeName(sCmdLine) 
    Next 
End Sub 

Обратите внимание, что все, что хлам с strResult существует только для целей отладки. И ... Я знаю что TestProcess вызова используется для тестирования если повышен уже слишком тяжелая артиллерия против комаров ...

+0

Это покрывает мои потребности на 100%. Большое вам спасибо за этот рабочий стол! – CDoc

0

Хотя documentation предлагает иначе ShellExecute ничего не возвращает, потому что метод выполняется асинхронно (т.е. возвращается немедленно, не дожидаясь завершения нового процесса). Синхронные вызовы в VBScript могут быть сделаны с помощью методов Run и Exec, но они не позволяют повысить привилегию.

В принципе, нет, то, что вы просите, невозможно.

Смежные вопросы