2

This File gets the wifi passwords using the terminal command netsh wlan show profiles I used pyinstaller to create a few .exe before and they worked jut fine.

The Code:

import subprocess
import time
import sys
import re

command_output = subprocess.run(["netsh", "wlan", "show", "profiles"], capture_output = True).stdout.decode()

profile_names = (re.findall("All User Profile     : (.*)\r", command_output))

wifi_list = []

if len(profile_names) != 0:
    for name in profile_names:
        wifi_profile = {}
        profile_info = subprocess.run(["netsh", "wlan", "show", "profile", name], capture_output = True).stdout.decode()
        if re.search("Security key           : Absent", profile_info):
            continue
        else:
            wifi_profile["ssid"] = name
            profile_info_pass = subprocess.run(["netsh", "wlan", "show", "profile", name, "key=clear"], capture_output = True).stdout.decode()
            password = re.search("Key Content            : (.*)\r", profile_info_pass)
            if password == None:
                wifi_profile["password"] = None
            else:
                wifi_profile["password"] = password[1]
            wifi_list.append(wifi_profile)

for x in range(len(wifi_list)):
    print(wifi_list[x])

time.sleep(5)
print("No more WiFi Profiles Found")
time.sleep(3)
sys.exit()

This is the Error I get when Running the .exe:

Traceback (most recent call last):
  File "GetWiFiPassWord.py", line 6, in <module>
  File "subprocess.py", line 453, in run
  File "subprocess.py", line 709, in __init__
  File "subprocess.py", line 1006, in _get_handles
OSError: [WinError 6] The handle is invalid
Alex Waygood
  • 6,304
  • 3
  • 24
  • 46
Chameleon
  • 23
  • 1
  • 1
  • 4

2 Answers2

2

This error apparently is thrown, because of this:

Line 1117 in subprocess.py is: p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE)

The service processes do not have a STDIN associated with them (TBC).

This problem can be avoided by supplying a file or null device as the stdin argument to popen.

In Python 3.x, you can simply pass stdin=subprocess.DEVNULL. E.g.

subprocess.Popen( args=[self.exec_path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.DEVNULL)

In Python 2.x, you need to get a filehandler to null, then pass that to popen:

devnull = open(os.devnull, 'wb')
subprocess.Popen( args=[self.exec_path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=devnull)  

Reference: OSError: (WinError 6) The handle is Invalid


In your problem:

subprocess.run(["netsh", "wlan", "show", "profiles"], capture_output = True, stdin=subprocess.DEVNULL).stdout.decode()
0

I have got the same problem with pyinstaller:

PyInstaller: 4.5.1
Python: 3.9.6
Platform: Windows-10-10.0.19042-SP0

thanks Behdad Abdollahi Moghadam. I've solved my problem by adding stdin and stder to subprocess.check_output

subprocess.check_output("C:\Program Files (x86)\xxx.exe", stdin=subprocess.DEVNULL, stderr=subprocess.STDOUT)
zhou gong
  • 31
  • 3