Проверьте, разрешено ли пользователю использовать командную строку.
На самом деле невозможно включить / отключить проверку, потому что открытие командной строки всегда будет работать, это просто любая активность в нем, которая включена / отключена.
Я использовал идею Скотта попробовать что-то и посмотреть, работает ли это. В моей ситуации у меня не было разрешения сделать файл в каталоге, поэтому я попробовал что-то еще.
Решение: скрытое окно 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