десятки раз сказал: 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
вызова используется для тестирования если повышен уже слишком тяжелая артиллерия против комаров ...
Может быть не совсем дубликата, но это, кажется, весьма актуально: http://stackoverflow.com/q/ 27222097/4996248 –
Я должен страдать от PEBKAC, потому что я не вижу, где его фактический ответ. Он просто вставил ручную секцию, но не ответил на вопрос OP ... на самом деле. – CDoc
, может быть, это не помогает, но принятый ответ, похоже, может дать вам некоторую идею. Если нет, надейтесь, что кто-то другой даст вам лучший ответ. –