我正在编写一个 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