Skip to content

Instantly share code, notes, and snippets.

@debakarr
Last active November 25, 2022 06:46
Show Gist options
  • Save debakarr/87d090faa6ebe7f688b6315fced559c9 to your computer and use it in GitHub Desktop.
Save debakarr/87d090faa6ebe7f688b6315fced559c9 to your computer and use it in GitHub Desktop.
WinRT in Python using winsdk

Password Save/Retrive from Windows Vault

API Documentation:

# password_vault.py
from winsdk.windows.security.credentials import PasswordCredential, PasswordVault


def save_credential_to_resource(resource: str, username: str, password: str) -> None:
    vault = PasswordVault()
    cred = PasswordCredential(resource, username, password)
    vault.add(cred)
    
def get_credential_from_resource(resource: str) -> PasswordCredential:
    vault = PasswordVault()
    try:
        creds = vault.find_all_by_resource(resource)
        return creds
    except OSError as ex:
        print(f"Could not find any resource for {resource}")


if __name__ == "__main__":
    vault_resource = "WinSDK Sample"
    save_credential_to_resource(vault_resource, "dummy_username", "dummy_password")
    save_credential_to_resource(vault_resource, "dummy_username2", "dummy_password2")
    creds = get_credential_from_resource(vault_resource)
    if creds is not None:
        for cred in creds:
            print(f"Username: {cred.user_name}")
            print(f"Password: {PasswordVault().retrieve(vault_resource, cred.user_name).password}")
$ python password_vault.py
Username: dummy_username2
Password: dummy_password2
Username: dummy_username
Password: dummy_password

Reading PDF details

API Documentation:

# pdf.py
import asyncio
from pathlib import Path
from typing import Optional

from winsdk.windows.data.pdf import PdfDocument
from winsdk.windows.storage import StorageFile


async def load_pdf(file: Path, password: Optional[str] = None) -> PdfDocument:
    pdf_file = await StorageFile.get_file_from_path_async(str(file))
    if password is not None:
        document = await PdfDocument.load_from_file_async(pdf_file, password)
    else:
        document = await PdfDocument.load_from_file_async(pdf_file)
    return document


if __name__ == "__main__":
    file = Path(input("Provide the pdf file path: ").strip())
    if not file.exists():
        raise FileNotFoundError(f"{str(file)} does not exist!")
    document = asyncio.run(load_pdf(file))
    print(f"{file} contains {document.page_count} pages.")
$ python pdf.py
Provide the pdf file path: somefile.pdf
somefile.pdf contains 5 pages.

Read RSS feed

API Documentation:

# rss.py
import asyncio

from winsdk.windows.foundation import Uri
from winsdk.windows.web.syndication import SyndicationClient, SyndicationFeed


async def get_feed(uri: Uri) -> SyndicationFeed:
    client = SyndicationClient()
    feed = await client.retrieve_feed_async(uri)
    return feed


if __name__ == "__main__":
    uri = Uri("https://blogs.windows.com/feed")
    result = asyncio.run(get_feed(uri))
    for item in result.items:
        print(item.title.text)
$ python rss.py
Block Friday Sale begins on Minecraft Marketplace
Announcing Windows 11 Insider Preview Build 25247
Releasing Windows 11 Build 22621.898 to the Release Preview Channel
Update to Windows Subsystem for Android™ on Windows 11 (November 2022)
Soccer Celebration now available at the Minecraft Marketplace
If you’re holiday shopping for Windows 11 PCs, check out these laptops
Save big on tech gifts with Microsoft Store’s Black Friday sale
Snapdragon powers new AI experiences on Windows 11, introduces new AR platform
RedBit builds custom solutions with Windows 11, Microsoft 365 and more
NVIDIA makes it easier to learn AI skills with resources now on Windows 11 PCs

Read XML

API Documentation:

# xml.py
from winsdk.windows.data.xml.dom import XmlDocument

if __name__ == "__main__":
    xml = """<html>Hello world</html>"""

    doc = XmlDocument()
    doc.load_xml(xml)
    root = doc.document_element
    assert root.node_name == "html"
    print(root.inner_text)
$ python xml.py
Hello world

Scan, connect, disconnect WiFi AP

API Documentation:

# wifi.py
import asyncio
from typing import Iterable, Optional

from winsdk.windows.devices.wifi import (
    WiFiAdapter,
    WiFiAvailableNetwork,
    WiFiConnectionStatus,
    WiFiPhyKind,
    WiFiReconnectionKind,
    WiFiNetworkKind 
)
from winsdk.windows.networking.connectivity import (
    NetworkAuthenticationType,
    NetworkEncryptionType,
)
from winsdk.windows.security.credentials import PasswordCredential


def log_network_details(network: WiFiAvailableNetwork) -> None:
    print(f"SSID: {network.ssid}")
    print(f"MAC address: {network.bssid}")
    print(f"Frequency: {network.channel_center_frequency_in_kilohertz} kHz")
    print(f"RSSI: {network.network_rssi_in_decibel_milliwatts} dBm (lower is better)")
    # TODO: Need to update below three print statement, once issue #1 in pywinrt is closed
    print(
        f"Authentication: {NetworkAuthenticationType(network.security_settings.network_authentication_type).name}"
    )
    print(
        f"Encryption: {NetworkEncryptionType(network.security_settings.network_encryption_type).name}"
    )
    print(f"PHY: {WiFiPhyKind(network.phy_kind).name}")
    print(f"WiFi Kind: {WiFiNetworkKind(network.network_kind).name}")
    print(f"Signal: {network.signal_bars} bars (higher is better)")
    print(f"Uptime: {network.uptime.duration}")


async def get_wifi_networks() -> Iterable[WiFiAvailableNetwork]:
    wifi_networks = []
    wifi_adapters = await WiFiAdapter.find_all_adapters_async()
    for wifi_adapter in wifi_adapters:
        await wifi_adapter.scan_async()
        for network in wifi_adapter.network_report.available_networks:
            wifi_networks.append(network)
    return wifi_networks


async def get_connected_wifi_network() -> Optional[WiFiAvailableNetwork]:
    wifi_adapters = await WiFiAdapter.find_all_adapters_async()
    connected_ssid = None

    for wifi_adapter in wifi_adapters:
        connected_profile = (
            await wifi_adapter.network_adapter.get_connected_profile_async()
        )
        if (
            connected_profile is not None
            and connected_profile.is_wlan_connection_profile
            and connected_profile.wlan_connection_profile_details is not None
        ):
            connected_ssid = (
                connected_profile.wlan_connection_profile_details.get_connected_ssid()
            )

        await wifi_adapter.scan_async()
        for network in wifi_adapter.network_report.available_networks:
            if network.ssid == connected_ssid:
                return network
    return None


async def connect_to_network(
    ssid: str,
    password: str = "",
    reconnection_type: WiFiReconnectionKind = WiFiReconnectionKind.MANUAL,
) -> bool:
    wifi_adapters = await WiFiAdapter.find_all_adapters_async()

    for wifi_adapter in wifi_adapters:
        await wifi_adapter.scan_async()
        for network in wifi_adapter.network_report.available_networks:
            if network.ssid == ssid:
                if (
                    network.security_settings.network_authentication_type
                    == NetworkAuthenticationType.OPEN80211
                    and network.security_settings.network_encryption_type
                    == NetworkEncryptionType.NONE
                ):
                    result = await wifi_adapter.connect_async(
                        network, reconnection_type
                    )
                else:
                    credential = PasswordCredential()
                    if password:
                        credential.password = password
                    result = await wifi_adapter.connect_async(
                        network,
                        reconnection_type,
                        credential,
                    )
                if result.connection_status == WiFiConnectionStatus.SUCCESS:
                    print(f"Successfully connected to {network.ssid}.")
                    return True
                else:
                    print(
                        # TODO: Need to update once issue #1 in pywinrt is closed
                        f"Could not connect to {network.ssid}. Error: {WiFiConnectionStatus(result.connection_status).name}."
                    )
                    return False
    print(f"Could not find network with SSID: {ssid}!")
    return False


if __name__ == "__main__":
    # Scan example
    wifi_networks = asyncio.run(get_wifi_networks())
    for network in wifi_networks:
        print("=" * 30)
        log_network_details(network)

    # Connect example
    # Replace with correct network ssid and password
    is_connected = asyncio.run(connect_to_network("network_ssid", "network_password"))

    # Scan connected example
    connected_network = asyncio.run(get_connected_wifi_network())
    if connected_network is not None:
        print("=" * 30)
        print("Connected WiFi Network:")
        log_network_details(connected_network)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment