如何检查 cmd.exe 是否被管理员禁用?

如何检查 cmd.exe 是否被管理员禁用?

我正在编写一个 VB 脚本,检查应用程序是否可用且可访问,例如 cmd.exe、powershell.exe 等等。

我的脚本允许我查看应用程序是否存在(它可以工作或不工作并返回布尔值)

如果通过 GPO 禁用 cmd,cmd从技术上讲它仍可以工作,因为它会加载,只是您无法使用它。

我需要某种方法来检查是否cmd已被禁用——没有管理权限。

我尝试运行 shell(cmd.exe),如果应用程序启动,它将返回 true 或 false,因此即使禁用它也会始终返回 true(如果应用程序不存在,则返回 false)。

正确的方法是什么,最好使用 VB 来检查 cmd 是否已被禁用,在这种情况下是否可以工作?

答案1

检查用户是否被允许使用命令提示符。

确实无法检查启用/禁用,因为命令提示符的打开始终有效,只是其中的任何活动被启用/禁用。我采用了 Scott 的想法,尝试一些东西,看看它是否有效。在我的处境中,我没有权限在目录中创建文件,所以我尝试了其他方法。

解决方案:使用简单的 echo 启动一个隐藏的 cmd 窗口。(ProcesID(=output)放在字符串中)=> 2 种可能的情况:1. 如果启用了 cmd,它将在此命令后关闭(由于 /c)。2. 如果禁用,它将保持打开状态,并显示消息“管理员已禁用命令提示符”,等待按键。

然后,获取此 cmd 的 PID 的任务列表,并将其放入一个字符串中,其中包含Shell运行来自 bburns.km 的函数,并由 Pupa Rebbe 在 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

相关内容