3

Я пишу сценарий VB, который проверяет, доступны ли и доступны ли приложения, например, cmd.exe, powershell.exe и так далее.

Мой скрипт позволяет мне увидеть, существует ли приложение (оно работает или нет, и возвращает логическое значение)

Если cmd отключен через GPO, cmd все равно будет работать технически, так как он будет загружаться, вы просто не сможете его использовать.

Мне нужен какой-то способ проверить, был ли отключен cmd - без прав администратора.

Я попытался запустить оболочку (cmd.exe), это вернет true или false, если приложение запущено, поэтому всегда будет возвращать true, даже если отключено (и false, если приложение не существует).

Каков был бы правильный подход, использующий - предпочтительно использование VB для проверки, был ли отключен cmd, который будет работать в этих условиях?

1 ответ1

0

Проверьте, разрешено ли пользователю использовать командную строку.

На самом деле невозможно включить / отключить проверку, потому что открытие командной строки всегда будет работать, это просто любая активность в нем, которая включена / отключена. Я использовал идею Скотта попробовать что-то и посмотреть, работает ли это. В моей ситуации у меня не было разрешения сделать файл в каталоге, поэтому я попробовал что-то еще.

Решение: скрытое окно cmd запускается с простым эхом. (ProcesID (= output) помещается в строку) => 2 возможных сценария: 1. Если cmd включен, он будет закрыт после этой команды (из-за /c). 2. Если он отключен, он останется открытым с сообщением "Командная строка отключена администратором", ожидающим нажатия клавиши.

Затем, список задач с PID этого ЦМД берется и поместить в строку с ShellRun функцией от bburns.km с изменением , предложенным Pupa Ребе на StackOverflow. 1. Если PID находится в списке, cmd существует и, следовательно, не был разрешен (зависает). Cmd убит. 2. Если PID отсутствует в строке, это означает, что cmd был закрыт, как и должно быть, и, следовательно, включен.

Вот код:

' Check if user is allowed to use the command prompt '
' by starting temporary cmd.exe and see if it hangs. '
Function IsCmdAllowed() As Boolean

  Dim TaskId As String, TaskList As String

  IsCmdAllowed = False

  ' Start hidden cmd, echo to have something that doesn't harm, keep Taskid. '
  TaskId = Shell("cmd.exe /c timeout /t 5 /nobreak echo ""hihi""", vbHide)

  ' not sure if waiting 0,5 sec is really necessary. '
  Application.Wait (Now + TimeValue("0:00:01") / 2)

  ' See if cmd still exists (check PID) and put data of cmd in string. '
  TaskList = ShellRun("Tasklist /fi ""PID eq " & TaskId & """ /nh")

  ' If The TaskId of cmd is in the string, it still exists'
  If Not TaskId = "" And _
     InStr(TaskList, TaskId) Then
    ' Kill the temporary cmd '
    Shell ("TASKKILL /PID " & TaskId)
  Else
    IsCmdAllowed = True
  End If

End Function

'Run a shell command, returning the output as a string: see bburns.km. '
Public Function ShellRun(sCmd As String) As String

  Dim oShell As Object, oExec As Object

  Set oShell = CreateObject("WScript.Shell")

  'run command
  Set oExec = oShell.Exec(sCmd)

  ShellRun = oExec.StdOut.ReadAll

End Function

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .