{"id":14980398,"url":"https://github.com/lifailon/winapi","last_synced_at":"2025-10-29T00:30:45.493Z","repository":{"id":172260653,"uuid":"649010535","full_name":"Lifailon/WinAPI","owner":"Lifailon","description":"REST API and Web server based on .NET HttpListener and backend PowerShell Core for Windows remote managment via Web browser or curl from Linux ","archived":true,"fork":false,"pushed_at":"2024-12-01T16:52:48.000Z","size":80287,"stargazers_count":26,"open_issues_count":0,"forks_count":3,"subscribers_count":4,"default_branch":"rsa","last_synced_at":"2025-02-07T11:16:34.094Z","etag":null,"topics":["api","dotnet","dotnet-framework","endpoint","http","http-server","linux","microsoft","powershell","powershell-core","powershell-webserver","rest","rest-api","restful-api","web","web-server","web-servers","webserver","windows","wmi"],"latest_commit_sha":null,"homepage":"https://nuget.org/packages/ps.win.api","language":"PowerShell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Lifailon.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-06-03T13:49:13.000Z","updated_at":"2024-12-01T16:53:50.000Z","dependencies_parsed_at":"2023-08-21T10:45:16.116Z","dependency_job_id":"5a111fd3-47e3-48c4-84a6-b6c944b0e7b1","html_url":"https://github.com/Lifailon/WinAPI","commit_stats":{"total_commits":167,"total_committers":2,"mean_commits":83.5,"dds":"0.23353293413173648","last_synced_commit":"d4b0bfe6565c99d0a6befaea790becb4f4865001"},"previous_names":["lifailon/web-winserviceman","lifailon/winservice-management","lifailon/win-rest-endpoints","lifailon/winapi"],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lifailon%2FWinAPI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lifailon%2FWinAPI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lifailon%2FWinAPI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Lifailon%2FWinAPI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Lifailon","download_url":"https://codeload.github.com/Lifailon/WinAPI/tar.gz/refs/heads/rsa","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238743913,"owners_count":19523201,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","dotnet","dotnet-framework","endpoint","http","http-server","linux","microsoft","powershell","powershell-core","powershell-webserver","rest","rest-api","restful-api","web","web-server","web-servers","webserver","windows","wmi"],"created_at":"2024-09-24T14:01:42.875Z","updated_at":"2025-10-29T00:30:35.484Z","avatar_url":"https://github.com/Lifailon.png","language":"PowerShell","readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/Lifailon/WinAPI/blob/rsa/Screen/ico/x128.png\" width=\"30\" /\u003e\n  WinAPI\n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://github.com/Lifailon/WinAPI\"\u003e\u003cimg title=\"GitHub Release\"src=\"https://img.shields.io/github/v/release/Lifailon/WinAPI?display_name=release\u0026logo=GitHub\u0026label=GitHub\u0026link=https%3A%2F%2Fgithub.com%2FLifailon%2FWinAPI%2F\"\u003e\u003c/a\u003e\n\u003ca href=\"https://www.nuget.org/packages/ps.win.api\"\u003e\u003cimg title=\"NuGet Version\"src=\"https://img.shields.io/nuget/v/ps.win.api?logo=NuGet\u0026label=NuGet\u0026link=https%3A%2F%2Fwww.nuget.org%2Fpackages%2Fps.win.api\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Lifailon/WinAPI\"\u003e\u003cimg title=\"GitHub top language\"src=\"https://img.shields.io/github/languages/top/Lifailon/WinAPI?logo=PowerShell\u0026link=https%3A%2F%2Fgithub.com%2FPowerShell%2FPowerShell\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Lifailon/WinAPI/blob/rsa/LICENSE\"\u003e\u003cimg title=\"GitHub License\"src=\"https://img.shields.io/github/license/Lifailon/WinAPI?link=https%3A%2F%2Fgithub.com%2FLifailon%2FWinAPI%2Fblob%2Frsa%2FLICENSE\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n**📝 Publication on [Habr](https://habr.com/ru/articles/783022/)**\n\n**🔎 Test version: [README](https://github.com/Lifailon/WinAPI/blob/rsa/Test/README.md)**\n\nREST API and Web server on base **.NET HttpListener** and backend only **PowerShell Core** (except for Web endpoints where minimal HTML, CSS, and JavaScript are used). Using WinAPI, you can quickly set up remote communication with Windows OS using API, without the need to configure WinRM or OpenSSH and get control from any platform, including **Linux** via browser or any REST client.\n\n**🔗 Implemented**:\n\n- [✅ Frontend web interface](#-implemented-endpoints)\n- [✅ Viewing and filtering Windows events](#-viewing-and-filtering-windows-events)\n- [✅ More than 20 unique endpoints](#-implemented-endpoints)\n- [✅ Authentication](#-authorization)\n- [✅ Response codes handling](#-response-code)\n- [✅ Converting to 4 data types](#-change-data-type)\n- [✅ Error handling](#-operational-stability)\n- [✅ Control module](#-module)\n- [✅ Logging](#-server-log)\n\n🍿 The server functionality is implemented in the [Kinozal-Bot](https://github.com/Lifailon/Kinozal-Bot) project.\n\n🐧 Since the server is built on .NET, this implementation is **cross-platform**, you can try managing Linux services from a Windows system: **[dotNET-Systemd-API](https://github.com/Lifailon/dotNET-Systemd-API)**.\n\n➡️ [🚀 Install](#-install)\n\n➡️ [📊 Examples](#-output-data-examples)\n\n## 🎉 Web server\n\n![Image alt](https://github.com/Lifailon/WinAPI/blob/rsa/Screen/Web/Web-Example-0.4.2.gif)\n\n- Process management:\n\n![Image alt](https://github.com/Lifailon/WinAPI/blob/rsa/Screen/Web/Web-Process.jpg)\n\n- Service management:\n\n![Image alt](https://github.com/Lifailon/WinAPI/blob/rsa/Screen/Web/Web-Service.jpg)\n\n- Hardware statistics:\n\n![Image alt](https://github.com/Lifailon/WinAPI/blob/rsa/Screen/Web/Web-Hardware.jpg)\n\n- Physical and logical disk statistics, metrics **IOps**, **SMART** (via embedded module **Storage 2.0**) and current network stats.\n\nTo give you an example, a file download from the Internet was taking place on a remote machine:\n\n![Image alt](https://github.com/Lifailon/WinAPI/blob/rsa/Screen/Web/Web-Metrics-Disk-Network.jpg)\n\n- Sensors from **LibreHardwareMonitor**:\n\n![Image alt](https://github.com/Lifailon/WinAPI/blob/rsa/Screen/Web/Web-Sensors.jpg)\n\n## 📄 Viewing and filtering Windows events\n\n![Image alt](https://github.com/Lifailon/WinAPI/blob/rsa/Screen/Web/Web-Event.gif)\n\n## 📚 Implemented endpoints\n\nAll GET requests can be output in one of the following formats: **JSON (default), HTML, XML, CSV**. When using a browser for GET requests, by default the response is processed in table format using HTML markup.\n\n- **GET**\n\n`/api/service` - Get list **all services** \\\n`/apt/service/service_name` - Get list service by the specified name passed in URL (using **wildcard** format) \\\n`/apt/process` - Get a list **all running processes** in an easy-to-read format (includes CPU and IOps performance) \\\n`/apt/process/process_name` - Get list running processes by the specified name passed in URL (using **wildcard** format) \\\n`/api/files` - Get a list of files and directories at the specified path in the **Path header** with the size, number of child files and directories, date of creation, access and modification\n\n- **GET metrics from WMI/CIMv2 (Common Information Model)**\n\n`/api/hardware` - Output of summary statistics of metrics close to **Task Manager** \\\n`/api/performance` - Output metrics from **Counter** \\\n`/api/cpu` - CPU use to procent for all core and total \\\n`/api/memory` - Memory use to GB and procent \\\n`/api/memory/slots` - Number of memory slots and their frequency \\\n`/api/disk/physical` - List of all physical disks, model, size, operation status and errors \\\n`/api/disk/logical` - List of all logical disks, model and size \\\n`/api/disk/partition` - List partitions of all physical disks \\\n`/api/disk/smart` - Temperature, health status, power on hours, start and stop cycle count \\\n`/api/disk/iops` - Read and write speed, queue, Input and Output operations per second for all physical disks \\\n`/api/video` - List of all video adapters, video memory size and resolution \\\n`/api/network` - List of all network adapters and their settings \\\n`api/network/ipconfig` - Settings for all network interfaces \\\n`api/network/stat` - Network connection statistics (ports) \\\n`api/network/interface/stat/current` - Current statistics of the active network interface (formatted dat) \\\n`api/network/interface/stat/total` - General statistics of the active network interface since system boot (raw data) \\\n`/api/update` - Windows update list \\\n`/api/software` - Installed software list \\\n`/api/driver` - Unique driver list\n\n- **GET metrics from Open Hardware Monitor via WMI/CIM**\n\n`/api/sensor` - Summary table of all sensors\n\nSource module: [PowerShellHardwareMonitor](https://github.com/Lifailon/PowerShellHardwareMonitor) (module installation is **not required**)\n\n- **Web**\n\n**HTTP server. Endpoints only via Web Browser**.\n\n`/service` - Checking status, starting and stopping services \\\n`/process` - Characteristics as well as starting and stopping processes \\\n`/events/list` - List of all Windows event providers \\\n`/events/\u003cEvent_Name\u003e` - List of all events of the selected log with the ability to filter by content\n\n💡 Use the text entry form to **filter messages** through the browser\n\n- **POST**\n\n`/apt/service/\u003cService_Name\u003e` - Stop, start and restart services by name (only one at a time, not wildcard format), status is transmitted in the request header (**Status: \u003cStop/Start/Restart\u003e**). Upon execution, the service status is returned in the format of a GET request. \\\n`/apt/process/\u003cProcess_Name\u003e` - Check the number of running processes (**Status: Check**), stop a process by name (**Status: Stop**) and start a process (**Status: Start**). To start a process, you can use the function to search for an executable file in the file system by its name, but you can also pass the path to the executable file through the request header (e.g. **Path: C:\\Program Files\\qBittorrent\\qbittorrent.exe**). \\\n`/api/file-delete` - Deleting the file or directory specified in the header **Path** one at a time\n\nTo find an executable file, the `Find-Process` function is used to scan the following directories:\n\n```PowerShell\n\"C:\\Program Files\",\n\"C:\\Program Files (x86)\",\n\"C:\\Users\\\u003cUserName\u003e\\AppData\\Roaming\",\n\"C:\\Users\\\u003cUserName\u003e\\Documents\"\n```\n\n## 🚀 Install\n\nUse in **[PowerShell Core](https://github.com/PowerShell/PowerShell)**.\n\nUse the [NuGet](https://www.nuget.org/packages/ps.win.api) package manager:\n\n```PowerShell\nInstall-Module ps.win.api -Repository NuGet -AllowClobber\n```\n\n💡 You must have a NuGet repository registered:\n\n```PowerShell\nRegister-PSRepository -Name \"NuGet\" -SourceLocation \"https://www.nuget.org/api/v2\" -InstallationPolicy Trusted\n```\n\nYou can use this command to install a module (includes the server part) from the GitHub repository:\n\n```PowerShell\nInvoke-Expression(New-Object Net.WebClient).DownloadString(\"https://raw.githubusercontent.com/Lifailon/WinAPI/rsa/WinAPI/Deploy/deploy-module-ps.win.api.ps1\")\n```\n\nWait for the command output: `Completed`\n\nTo find out where the module is installed, use the command:\n\n```PowerShell\n\u003e $(Get-Module ps.win.api).Path\nC:\\Users\\lifailon\\Documents\\PowerShell\\Modules\\ps.win.api\\0.4.3\\ps.win.api.psm1\n```\n\nYou can configure port, login and password for connect to the server in the configuration file `WinAPI.ini`, which is located in the directory with the module:\n\n```PowerShell\nport         = 8443\nuser         = rest\npass         = api\n```\n\nOpen the specified port on your firewall:\n\n```PowerShell\nNew-NetFirewallRule -DisplayName \"WinAPI\" -Profile Any -Direction Inbound -Action Allow -Protocol TCP -LocalPort 8443\n```\n\nUse the following commands to start and check the operation status server: `Start-WinAPI` and `Test-WinAPI`\n\n```PowerShell\n\u003e Start-WinAPI\n\u003e Test-WinAPI\n\nPort Status\n---- ------\n8443 Open\n```\n\nTo stop the server: `Stop-WinAPI`\n\n```PowerShell\n\u003e Stop-WinAPI\n\u003e Test-WinAPI\n\nPort Status\n---- ------\n8443 Closed\n```\n\nEach call to the endpoint is logged to the `WinAPI.log` file. You can disable logging:\n\n```PowerShell\nLog_File    = True\n```\n\nOr output the current log in the console (`tail` mode):\n\n```PowerShell\n\u003e Read-WinAPI\n06.02.2024 04:41:58 Start server\n06.02.2024 04:41:58 192.168.3.99:18447 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 =\u003e GET / =\u003e 200\n06.02.2024 04:43:45 Start server\n06.02.2024 04:43:55 192.168.3.99:19107 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 =\u003e GET /process =\u003e 200\n06.02.2024 04:43:56 192.168.3.99:19107 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 =\u003e GET /service =\u003e 200\n...\n```\n\nSpecify the data source for the `/api/sensor` endpoint (default: **LibreHardwareMonitor**):\n\n```PowerShell\nSensorSource = OpenHardwareMonitor\n```\n\n💡 For the endpoint to work, you must download the portable version of the [LibreHardwareMonitor](https://github.com/LibreHardwareMonitor/LibreHardwareMonitor) (Default) or [OpenHardwareMonitor](https://openhardwaremonitor.org/downloads/) program in path `C:\\Users\\\u003cUserName\u003e\\Documents\\LibreHardwareMonitor` and `C:\\Users\\\u003cUserName\u003e\\Documents\\OpenHardwareMonitor\\OpenHardwareMonitor`.\n\nFor a quick installation LibreHardwareMonitor, use this command in your terminal:\n\n```PowerShell\nInvoke-Expression(New-Object Net.WebClient).DownloadString(\"https://raw.githubusercontent.com/Lifailon/PowerShell.HardwareMonitor/rsa/Install/Install-LibreHardwareMonitor.ps1\")\n```\n\nInstall OpenHardwareMonitor:\n\n```PowerShell\nInvoke-Expression(New-Object Net.WebClient).DownloadString(\"https://raw.githubusercontent.com/Lifailon/PowerShell.HardwareMonitor/rsa/Install/Install-OpenHardwareMonitor.ps1\")\n```\n\n### There are other ways to start the server, but they are not supported since version 0.4 and the advent the module.\n\n- Running service (added in version 0.3.1)\n\n\u003e 💡 **For reason unknown to me, the service doesn't process all the code on startup** (doesn't create an ini file and hangs at POST request to stop the process).\n\nTo install the server part as a **service (used NSSM)**, download scripts to **automatically [deployument](https://github.com/Lifailon/WinAPI/tree/rsa/WinAPI/Service), start, stop and remove**.\n\n- Running executable (added in version 0.3.0)\n\n\u003e 💡 **PowerShell 5.1 acts as the default handler (limitations of the ps2exe module)**, which prevents all endpoints from working correctly\n\nThere are two options for launching using an **[executable file](https://github.com/Lifailon/WinAPI/tree/rsa/WinAPI/Bin)** ([build script](https://github.com/Lifailon/WinAPI/blob/rsa/WinAPI/Bin/compiling-ps2exe.ps1)).\n\n**winapi-console.exe** - process startup in a window with logging output of connections to the server\n\n**winapi-process.exe** - background process startup\n\nTo stop the background process, use the command: `Get-Process *winapi* | Stop-Process`\n\n## 📡 Module\n\nModule for server management (starting and stopping background process) and interaction with remote server. The module implements most of the functions used in the server part to run on a local computer and receive the same information from a remote computer via WinAPI.\n\n```PowerShell\n\u003e Import-Module ps.win.api\n\u003e Get-command -Module ps.win.api\n\nCommandType     Name                             Version    Source\n-----------     ----                             -------    ------\nFunction        Find-Process                     0.4.3      WinAPI\nFunction        Get-CPU                          0.4.3      WinAPI\nFunction        Get-DiskLogical                  0.4.3      WinAPI\nFunction        Get-DiskPartition                0.4.3      WinAPI\nFunction        Get-DiskPhysical                 0.4.3      WinAPI\nFunction        Get-Driver                       0.4.3      WinAPI\nFunction        Get-Event                        0.4.3      WinAPI\nFunction        Get-Files                        0.4.3      WinAPI\nFunction        Get-Hardware                     0.4.3      WinAPI\nFunction        Get-HardwareNoJob                0.4.3      WinAPI\nFunction        Get-IOps                         0.4.3      WinAPI\nFunction        Get-MemorySize                   0.4.3      WinAPI\nFunction        Get-MemorySlots                  0.4.3      WinAPI\nFunction        Get-NetInterfaceStat             0.4.3      WinAPI\nFunction        Get-NetIpConfig                  0.4.3      WinAPI\nFunction        Get-NetStat                      0.4.3      WinAPI\nFunction        Get-Performance                  0.4.3      WinAPI\nFunction        Get-ProcessPerformance           0.4.3      WinAPI\nFunction        Get-Smart                        0.4.3      WinAPI\nFunction        Get-Software                     0.4.3      WinAPI\nFunction        Get-VideoCard                    0.4.3      WinAPI\nFunction        Get-WinUpdate                    0.4.3      WinAPI\nFunction        Read-WinAPI                      0.4.3      WinAPI\nFunction        Start-WinAPI                     0.4.3      WinAPI\nFunction        Stop-WinAPI                      0.4.3      WinAPI\nFunction        Test-WinAPI                      0.4.3      WinAPI\n```\n\nThe format is always the same, if you don't use the ComputerName parameter, the function runs locally on your computer. If you use the ComputerName parameter, we access the desired endpoint and get a response from the WinAPI server.\n\nExample:\n\n```PowerShell\n\u003e Get-DiskPhysical | Format-Table\n\nModel                         Size   PartitionCount Interface Status ConfigManagerErrorCode LastErrorCode\n-----                         ----   -------------- --------- ------ ---------------------- -------------\nWD PC SN740 SDDPNQD-1T00-1027 954 Gb              4 SCSI      OK                          0\n\n\u003e Get-DiskPhysical -ComputerName 192.168.3.100 -Port 8443 -User rest -Pass api | Format-Table\n\nModel                  Size    PartitionCount Interface Status ConfigManagerErrorCode LastErrorCode\n-----                  ----    -------------- --------- ------ ---------------------- -------------\nST1000DM003-1CH162     932 Gb               1 IDE       OK                          0\nWDC WD2005FBYZ-01YCBB2 1863 Gb              1 IDE       OK                          0\nMSI M390 250GB         233 Gb               3 SCSI      OK                          0\n```\n\n\u003e 💡 The Get-Hardware function uses the ThreadJob module, the script provides automatic installation in case of its absence. This is the only function which execution time was reduced by half due to threads (on average 3.3 seconds versus 1.4 seconds).\n\n![Image alt](https://github.com/Lifailon/WinAPI/blob/rsa/Screen/Console/Get-Hardware-Threads-Diff.jpg)\n\n## 🔒 Authorization\n\nBase authorization has been implemented (based on **Base64**).\n\nDefault login and password:\n```PowerShell\n$user = \"rest\"\n$pass = \"api\"\n```\n- Example 1.\n\n```PowerShell\n$SecureString = ConvertTo-SecureString $pass -AsPlainText -Force\n$Credential = New-Object System.Management.Automation.PSCredential($user, $SecureString)\nInvoke-RestMethod -Credential $Credential -AllowUnencryptedAuthentication -Uri http://192.168.3.99:8443/api/service\n```\n- Example 2.\n\n```PowerShell\n$EncodingCred = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(\"${user}:${pass}\"))\n$Headers = @{\"Authorization\" = \"Basic ${EncodingCred}\"}\nInvoke-RestMethod -Headers $Headers -Uri http://192.168.3.99:8443/api/service\n```\n- Example 3. cURL client. Receiving data in different formats.\n\n```Bash\nuser=\"rest\"\npass=\"api\"\ncurl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/service | jq  -r '.[] | {data: \"\\(.Name) - \\(.Status)\"} | .data'\ncurl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/service/win\ncurl -s -X GET -u $user:$pass -H 'Content-Type: application/json' http://192.168.3.99:8443/api/service/winrm\ncurl -s -X GET -u $user:$pass -H 'Content-Type: application/html' http://192.168.3.99:8443/api/service/winrm\ncurl -s -X GET -u $user:$pass -H 'Content-Type: application/xml' http://192.168.3.99:8443/api/service/winrm\ncurl -s -X GET -u $user:$pass -H 'Content-Type: application/csv' http://192.168.3.99:8443/api/service/winrm\ncurl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/process\ncurl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/process/torrent\n```\n\n\u003e It is possible to configure filtering by IP address or subnet. It is possible to configure other authentication methods to HttpListener.\n\n## 📢 Response code\n\n**200. Request completed successfully.**\n\n**400. Bad Request.** Invalid header and service or process could not be found.\n\n**401. Unauthorized.** Login or password is invalid.\n\n**404. Not found endpoint.** Response to the lack of endpoints.\n\n**405. Method not allowed.** Response to other methods.\n\n## ⚠️ Operational stability\n\nProcessing of simultaneous requests from several clients (managed to test three simultaneous connections).\n\nIf the previous request has not been processed yet and a new request from the same client arrives, the server terminates with an error, this behavior was detected in the browser when quickly refreshing pages, to handle this event is implemented **automatic restart of the server**. For Web-client such restart is processed without error and in the process of page refresh the response of the last request is returned.\n\nIn Invoke-RestMethod and curl, interrupting the previous request and sending a new one to another endpoint works without error and the response of the last request is returned (taking into account the processing time of the previous one).\n\n## 🐧 Examples POST request from Linux client\n\n- Stop and start service **WinRM**:\n\nFirst find the service to pass its full name to the to url for POST request (example, using part of the name in GET request).\n\n```Bash\nuser=\"rest\"\npass=\"api\"\ncurl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/service/win | jq -r .[].Name\ncurl -s -X POST -u $user:$pass --data '' http://192.168.3.99:8443/api/service/winrm -H \"Status: Stop\"\ncurl -s -X POST -u $user:$pass --data '' http://192.168.3.99:8443/api/service/winrm -H \"Status: Start\"\ncurl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/service/winrm | jq -r .Status\n```\n\n- Stop and start process **qBittorrent**:\n\nFirst find the process by its name in wilcard format using a GET request. Using **Check** in the **Status** header, we display the number of running processes. To stop the process, use header **Status: Stop**. To run the process, two examples are given using the name to find the executable and the second option, specify the full path to the executable.\n\n```Bash\nuser=\"rest\"\npass=\"api\"\ncurl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/process/torrent\ncurl -s -X POST -u $user:$pass --data '' http://192.168.3.99:8443/api/process/qbittorrent -H \"Status: Check\"\ncurl -s -X POST -u $user:$pass --data '' http://192.168.3.99:8443/api/process/qbittorrent -H \"Status: Stop\"\ncurl -s -X POST -u $user:$pass --data '' http://192.168.3.99:8443/api/process/qbittorrent -H \"Status: Start\"\n```\n\n- Stop and start process **Plex Media Server**:\n\n\u003e If the service in the **name contains spaces**, pass the name in the url request using the **underscore (_) delimiter**.\n\n```Bash\nuser=\"rest\"\npass=\"api\"\ncurl -s -X POST -u $user:$pass --data '' http://192.168.3.99:8443/api/process/plex_media_server -H \"Status: Stop\"\ncurl -s -X POST -u $user:$pass --data '' http://192.168.3.99:8443/api/process/plex_media_server -H \"Status: Start\" -H \"Path: C:\\Program Files\\Plex\\Plex Media Server\\Plex Media Server.exe\"\n```\n\n- Delete file\n\nFirst, we look through the parent directories and look for the required file. In the **Path header we pass the FullName** of the desired file (or directory).\n\n```Bash\ncurl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/files -H \"Path: D:/\"\ncurl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/files -H \"Path: D:/Movies\"\ncurl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/files -H \"Path: D:/Movies/The-Flash\"\ncurl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/files -H \"Path: D:/Movies/The-Flash/4 sezon\"\ncurl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/files -H \"Path: D:/Movies/The-Flash/4 sezon/The.Flash.S04E23.1080p.rus.LostFilm.TV.mkv\"\ncurl -s -X POST -u $user:$pass -data '' http://192.168.3.99:8443/api/file-delete -H \"Path: D:/Movies/The-Flash/4 sezon/The.Flash.S04E23.1080p.rus.LostFilm.TV.mkv\"\n```\n\n## 🔌 Windows client\n\n```PowerShell\n$user = \"rest\"\n$pass = \"api\"\n$EncodingCred = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(\"${user}:${pass}\"))\n```\n\n- Stop service **WinRM**:\n\n```PowerShell\n$Headers = @{\"Authorization\" = \"Basic ${EncodingCred}\"}\n$Headers += @{\"Status\" = \"Stop\"}\nInvoke-RestMethod -Headers $Headers -Uri http://192.168.3.99:8443/api/service/winrm\nInvoke-RestMethod -Headers $Headers -Method Post -Uri http://192.168.3.99:8443/api/service/winrm\n```\n- Start service **WinRM**:\n\n```PowerShell\n$Headers = @{\"Authorization\" = \"Basic ${EncodingCred}\"}\n$Headers += @{\"Status\" = \"Start\"}\nInvoke-RestMethod -Headers $Headers -Method Post -Uri http://192.168.3.99:8443/api/service/winrm\n```\n\n## 📬 Change data type\n\nExamples:\n\n```bash\nuser=rest\npass=api\n\ncurl -s -X GET -u $user:$pass -H 'Content-Type: application/json' http://192.168.3.99:8443/api/service/win | jq\n[\n  {\n    \"Name\": \"WinAPI\",\n    \"DisplayName\": \"WinAPI\",\n    \"Status\": \"Stopped\",\n    \"StartType\": \"Manual\"\n  },\n  {\n    \"Name\": \"WinDefend\",\n    \"DisplayName\": \"Служба антивирусной программы Microsoft Defender\",\n    \"Status\": \"Running\",\n    \"StartType\": \"Automatic\"\n  },\n  {\n    \"Name\": \"WinHttpAutoProxySvc\",\n    \"DisplayName\": \"Служба автоматического обнаружения веб-прокси WinHTTP\",\n    \"Status\": \"Running\",\n    \"StartType\": \"Manual\"\n  },\n  {\n    \"Name\": \"Winmgmt\",\n    \"DisplayName\": \"Инструментарий управления Windows\",\n    \"Status\": \"Running\",\n    \"StartType\": \"Automatic\"\n  },\n  {\n    \"Name\": \"WinRM\",\n    \"DisplayName\": \"Служба удаленного управления Windows (WS-Management)\",\n    \"Status\": \"Stopped\",\n    \"StartType\": \"Manual\"\n  }\n]\n\ncurl -s -X GET -u $user:$pass -H 'Content-Type: application/xml' http://192.168.3.99:8443/api/service/winrm | xq\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n\u003cObjects\u003e\n  \u003cObject Type=\"System.Management.Automation.PSCustomObject\"\u003e\n    \u003cProperty Name=\"Name\" Type=\"System.String\"\u003eWinRM\u003c/Property\u003e\n    \u003cProperty Name=\"DisplayName\" Type=\"System.String\"\u003eСлужба удаленного управления Windows (WS-Management)\u003c/Property\u003e\n    \u003cProperty Name=\"Status\" Type=\"System.String\"\u003eStopped\u003c/Property\u003e\n    \u003cProperty Name=\"StartType\" Type=\"System.String\"\u003eManual\u003c/Property\u003e\n  \u003c/Object\u003e\n\u003c/Objects\u003e\n\ncurl -s -X GET -u $user:$pass -H 'Content-Type: application/csv' http://192.168.3.99:8443/api/service/winrm\n\"Name\",\"DisplayName\",\"Status\",\"StartType\" \"WinRM\",\"Служба удаленного управления Windows (WS-Management)\",\"Stopped\",\"Manual\"\n\ncurl -s -X GET -u $user:$pass -H 'Content-Type: application/html' http://192.168.3.99:8443/api/service/winrm\n\u003c!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"\u003e \u003chtml xmlns=\"http://www.w3.org/1999/xhtml\"\u003e \u003chead\u003e \u003ctitle\u003eHTML TABLE\u003c/title\u003e \u003c/head\u003e\u003cbody\u003e \u003ctable\u003e \u003ccolgroup\u003e\u003ccol/\u003e\u003ccol/\u003e\u003ccol/\u003e\u003ccol/\u003e\u003c/colgroup\u003e \u003ctr\u003e\u003cth\u003eName\u003c/th\u003e\u003cth\u003eDisplayName\u003c/th\u003e\u003cth\u003eStatus\u003c/th\u003e\u003cth\u003eStartType\u003c/th\u003e\u003c/tr\u003e \u003ctr\u003e\u003ctd\u003eWinRM\u003c/td\u003e\u003ctd\u003eСлужба удаленного управления Windows (WS-Management)\u003c/td\u003e\u003ctd\u003eStopped\u003c/td\u003e\u003ctd\u003eManual\u003c/td\u003e\u003c/tr\u003e \u003c/table\u003e \u003c/body\u003e\u003c/html\u003e\n```\n\n## 📊 Output data examples\n\n### Service management\n\n```Bash\nlifailon@hv-devops-01:~$ user=\"rest\"\nlifailon@hv-devops-01:~$ pass=\"api\"\n```\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/service/win`\n\n```JSON\n[\n  {\n    \"Name\": \"WinDefend\",\n    \"DisplayName\": \"Служба антивирусной программы Microsoft Defender\",\n    \"Status\": \"Running\",\n    \"StartType\": \"Automatic\"\n  },\n  {\n    \"Name\": \"WinHttpAutoProxySvc\",\n    \"DisplayName\": \"Служба автоматического обнаружения веб-прокси WinHTTP\",\n    \"Status\": \"Running\",\n    \"StartType\": \"Manual\"\n  },\n  {\n    \"Name\": \"Winmgmt\",\n    \"DisplayName\": \"Инструментарий управления Windows\",\n    \"Status\": \"Running\",\n    \"StartType\": \"Automatic\"\n  },\n  {\n    \"Name\": \"WinRM\",\n    \"DisplayName\": \"Служба удаленного управления Windows (WS-Management)\",\n    \"Status\": \"Stopped\",\n    \"StartType\": \"Manual\"\n  }\n]\n```\n\n`curl -s -X GET -u $user:$pass -H 'Content-Type: application/json' http://192.168.3.99:8443/api/service/winrm`\n\n```JSON\n{\n  \"Name\": \"WinRM\",\n  \"DisplayName\": \"Служба удаленного управления Windows (WS-Management)\",\n  \"Status\": \"Stopped\",\n  \"StartType\": \"Manual\"\n}\n```\n\n`curl -s -X POST -u $user:$pass --data '' http://192.168.3.99:8443/api/service/winrm -H \"Status: Start\"`\n\n```JSON\n{\n  \"Name\": \"winrm\",\n  \"DisplayName\": \"Служба удаленного управления Windows (WS-Management)\",\n  \"Status\": \"Running\",\n  \"StartType\": \"Manual\"\n}\n```\n\n### Process management\n\n`curl -s -X POST -u $user:$pass --data '' http://192.168.3.99:8443/api/process/qbittorrent -H \"Status: Check\"`\n\n```\nNumber active qbittorrent processes: 0\n```\n\n`curl -s -X POST -u $user:$pass --data '' http://192.168.3.99:8443/api/process/qbittorrent -H \"Status: Start\"`\n\n```\nNumber active qbittorrent processes: 1\n```\n\n`curl -s -u $user:$pass http://192.168.3.99:8443/api/process/qbittorrent`\n\n```JSON\n{\n  \"Name\": \"qbittorrent\",\n  \"ProcTime\": \"0 %\",\n  \"IOps\": 3,\n  \"IObsRead\": \"1,84 Mb\",\n  \"IObsWrite\": \"0,00 Mb\",\n  \"RunTime\": \"06:57:59\",\n  \"TotalTime\": \"00:01:42\",\n  \"UserTime\": \"00:01:09\",\n  \"PrivTime\": \"00:00:33\",\n  \"WorkingSet\": \"323,29 Mb\",\n  \"PeakWorkingSet\": \"366,97 Mb\",\n  \"PageMemory\": \"965,08 Mb\",\n  \"Threads\": 25,\n  \"Handles\": 623,\n  \"Path\": \"C:\\\\Program Files\\\\qBittorrent\\\\qbittorrent.exe\",\n  \"Company\": \"The qBittorrent Project\",\n  \"Version\": \"v4.6.0\"\n}\n```\n\n`curl -s -X POST -u $user:$pass --data '' http://192.168.3.99:8443/api/process/qbittorrent -H \"Status: Stop\"`\n\n```\nNumber active qbittorrent processes: 0\n```\n\n### Hardware metrics (general summary, performance, cpu, memory and video)\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/hardware`\n\n```JSON\n{\n  \"Host\": \"HUAWEI-BOOK\",\n  \"Uptime\": \"17:17\",\n  \"BootDate\": \"01.02.2024 09:05:04\",\n  \"Owner\": \"lifailon\",\n  \"OS\": \"Майкрософт Windows 10 Pro\",\n  \"Motherboard\": \"HUAWEI MRGF-XX-PCB M1010\",\n  \"Processor\": \"12th Gen Intel(R) Core(TM) i7-1260P\",\n  \"Core\": 12,\n  \"Thread\": 16,\n  \"CPU\": \"14 %\",\n  \"ProcessCount\": 305,\n  \"ThreadsCount\": 4641,\n  \"HandlesCount\": 157065,\n  \"MemoryAll\": \"16 GB\",\n  \"MemoryUse\": \"11,00 GB\",\n  \"MemoryUseProc\": \"70 %\",\n  \"WorkingSet\": \"11,06 GB\",\n  \"PageMemory\": \"12,54 GB\",\n  \"MemorySlots\": 8,\n  \"PhysicalDiskCount\": 1,\n  \"PhysicalDiskAllSize\": \"954 Gb\",\n  \"LogicalDiskCount\": 3,\n  \"LogicalDiskAllSize\": \"1053 Gb\",\n  \"DiskTotalTime\": \"2 %\",\n  \"DiskTotalIOps\": 3,\n  \"DiskTotalRead\": \"0,015 MByte/Sec\",\n  \"DiskTotalWrite\": \"0,000 MByte/Sec\",\n  \"VideoCardCount\": 3,\n  \"VideoCardAllSize\": \"1 Gb\",\n  \"NetworkAdapterEnableCount\": 3,\n  \"NetworkReceivedCurrent\": \"0,154 MByte/Sec\",\n  \"NetworkSentCurrent\": \"0,044 MByte/Sec\",\n  \"NetworkReceivedTotal\": \"4,13 GByte\",\n  \"NetworkSentTotal\": \"0,34 GByte\",\n  \"PortListenCount\": 50,\n  \"PortEstablishedCount\": 54\n}\n```\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/performance`\n\n```JSON\n{\n  \"CPUTotalTime\": \"1 %\",\n  \"MemoryUse\": \"30 %\",\n  \"DiskTotalTime\": \"12 %\",\n  \"AdapterName\": \"intel[r] wi-fi 6e ax211 160mhz\",\n  \"AdapterSpeed\": \"0,093 MByte/Sec\"\n}\n```\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/cpu`\n\n```JSON\n[\n  {\n    \"Name\": \"0\",\n    \"ProcessorTime\": \"8 %\",\n    \"PrivilegedTime\": \"6 %\",\n    \"UserTime\": \"6 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"79 %\"\n  },\n  {\n    \"Name\": \"1\",\n    \"ProcessorTime\": \"0 %\",\n    \"PrivilegedTime\": \"0 %\",\n    \"UserTime\": \"0 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"99 %\"\n  },\n  {\n    \"Name\": \"2\",\n    \"ProcessorTime\": \"2 %\",\n    \"PrivilegedTime\": \"0 %\",\n    \"UserTime\": \"6 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"98 %\"\n  },\n  {\n    \"Name\": \"3\",\n    \"ProcessorTime\": \"8 %\",\n    \"PrivilegedTime\": \"18 %\",\n    \"UserTime\": \"0 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"76 %\"\n  },\n  {\n    \"Name\": \"4\",\n    \"ProcessorTime\": \"0 %\",\n    \"PrivilegedTime\": \"0 %\",\n    \"UserTime\": \"0 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"99 %\"\n  },\n  {\n    \"Name\": \"5\",\n    \"ProcessorTime\": \"8 %\",\n    \"PrivilegedTime\": \"18 %\",\n    \"UserTime\": \"0 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"76 %\"\n  },\n  {\n    \"Name\": \"6\",\n    \"ProcessorTime\": \"0 %\",\n    \"PrivilegedTime\": \"0 %\",\n    \"UserTime\": \"0 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"100 %\"\n  },\n  {\n    \"Name\": \"7\",\n    \"ProcessorTime\": \"8 %\",\n    \"PrivilegedTime\": \"18 %\",\n    \"UserTime\": \"0 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"76 %\"\n  },\n  {\n    \"Name\": \"8\",\n    \"ProcessorTime\": \"14 %\",\n    \"PrivilegedTime\": \"12 %\",\n    \"UserTime\": \"6 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"68 %\"\n  },\n  {\n    \"Name\": \"9\",\n    \"ProcessorTime\": \"33 %\",\n    \"PrivilegedTime\": \"18 %\",\n    \"UserTime\": \"18 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"60 %\"\n  },\n  {\n    \"Name\": \"10\",\n    \"ProcessorTime\": \"27 %\",\n    \"PrivilegedTime\": \"12 %\",\n    \"UserTime\": \"18 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"68 %\"\n  },\n  {\n    \"Name\": \"11\",\n    \"ProcessorTime\": \"27 %\",\n    \"PrivilegedTime\": \"18 %\",\n    \"UserTime\": \"12 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"62 %\"\n  },\n  {\n    \"Name\": \"12\",\n    \"ProcessorTime\": \"27 %\",\n    \"PrivilegedTime\": \"6 %\",\n    \"UserTime\": \"24 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"71 %\"\n  },\n  {\n    \"Name\": \"13\",\n    \"ProcessorTime\": \"14 %\",\n    \"PrivilegedTime\": \"12 %\",\n    \"UserTime\": \"6 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"76 %\"\n  },\n  {\n    \"Name\": \"14\",\n    \"ProcessorTime\": \"21 %\",\n    \"PrivilegedTime\": \"18 %\",\n    \"UserTime\": \"6 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"69 %\"\n  },\n  {\n    \"Name\": \"15\",\n    \"ProcessorTime\": \"0 %\",\n    \"PrivilegedTime\": \"0 %\",\n    \"UserTime\": \"0 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"94 %\"\n  },\n  {\n    \"Name\": \"_Total\",\n    \"ProcessorTime\": \"11 %\",\n    \"PrivilegedTime\": \"9 %\",\n    \"UserTime\": \"6 %\",\n    \"InterruptTime\": \"0 %\",\n    \"IdleTime\": \"80 %\"\n  }\n]\n```\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/memory`\n\n```JSON\n{\n  \"MemoryAll\": \"15,73 GB\",\n  \"MemoryUse\": \"10,98 GB\",\n  \"MemoryUseProc\": \"70 %\",\n  \"PageSize\": \"48,00 GB\",\n  \"PageUse\": \"7,92 GB\",\n  \"PageUseProc\": \"17 %\",\n  \"PagePath\": \"D:\\\\pagefile.sys\",\n  \"MemoryVirtAll\": \"63,73 GB\",\n  \"MemoryVirtUse\": \"18,90 GB\",\n  \"MemoryVirtUseProc\": \"30 %\",\n  \"ProcWorkingSet\": \"11,02 GB\",\n  \"ProcPageMemory\": \"12,62 GB\"\n}\n```\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/memory/slots`\n\n```JSON\n[\n  {\n    \"Tag\": \"Physical Memory 0\",\n    \"Model\": \"5200 Mhz  \",\n    \"Size\": \"2048 Mb\",\n    \"Device\": \"Controller0-ChannelA\",\n    \"Bank\": \"BANK 0\"\n  },\n  {\n    \"Tag\": \"Physical Memory 1\",\n    \"Model\": \"5200 Mhz  \",\n    \"Size\": \"2048 Mb\",\n    \"Device\": \"Controller0-ChannelB\",\n    \"Bank\": \"BANK 1\"\n  },\n  {\n    \"Tag\": \"Physical Memory 2\",\n    \"Model\": \"5200 Mhz  \",\n    \"Size\": \"2048 Mb\",\n    \"Device\": \"Controller0-ChannelC\",\n    \"Bank\": \"BANK 2\"\n  },\n  {\n    \"Tag\": \"Physical Memory 3\",\n    \"Model\": \"5200 Mhz  \",\n    \"Size\": \"2048 Mb\",\n    \"Device\": \"Controller0-ChannelD\",\n    \"Bank\": \"BANK 3\"\n  },\n  {\n    \"Tag\": \"Physical Memory 4\",\n    \"Model\": \"5200 Mhz  \",\n    \"Size\": \"2048 Mb\",\n    \"Device\": \"Controller1-ChannelA\",\n    \"Bank\": \"BANK 0\"\n  },\n  {\n    \"Tag\": \"Physical Memory 5\",\n    \"Model\": \"5200 Mhz  \",\n    \"Size\": \"2048 Mb\",\n    \"Device\": \"Controller1-ChannelB\",\n    \"Bank\": \"BANK 1\"\n  },\n  {\n    \"Tag\": \"Physical Memory 6\",\n    \"Model\": \"5200 Mhz  \",\n    \"Size\": \"2048 Mb\",\n    \"Device\": \"Controller1-ChannelC\",\n    \"Bank\": \"BANK 2\"\n  },\n  {\n    \"Tag\": \"Physical Memory 7\",\n    \"Model\": \"5200 Mhz  \",\n    \"Size\": \"2048 Mb\",\n    \"Device\": \"Controller1-ChannelD\",\n    \"Bank\": \"BANK 3\"\n  }\n]\n```\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/video`\n\n```JSON\n[\n  {\n    \"Model\": \"Intel(R) Iris(R) Xe Graphics\",\n    \"Display\": \"3120x2080\",\n    \"VideoRAM\": \"1 Gb\"\n  },\n  {\n    \"Model\": \"Virtual Display Device\",\n    \"Display\": \"3840x2560\",\n    \"VideoRAM\": \"0 Gb\"\n  },\n  {\n    \"Model\": \"Citrix Indirect Display Adapter\",\n    \"Display\": \"x\",\n    \"VideoRAM\": \"0 Gb\"\n  }\n]\n```\n\n### Disk metrics (Physical, Logical, SMART and IOps)\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/disk/physical`\n\n```JSON\n{\n  \"Model\": \"WD PC SN740 SDDPNQD-1T00-1027\",\n  \"Size\": \"954 Gb\",\n  \"PartitionCount\": 4,\n  \"Interface\": \"SCSI\",\n  \"Status\": \"OK\",\n  \"ConfigManagerErrorCode\": 0,\n  \"LastErrorCode\": null\n}\n```\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/disk/logical`\n\n```JSON\n[\n  {\n    \"Logical_Disk\": \"C:\",\n    \"FileSystem\": \"NTFS\",\n    \"VolumeName\": \"\",\n    \"AllSize\": \"153 Gb\",\n    \"FreeSize\": \"44 Gb\",\n    \"Free\": \"29 %\"\n  },\n  {\n    \"Logical_Disk\": \"D:\",\n    \"FileSystem\": \"NTFS\",\n    \"VolumeName\": \"\",\n    \"AllSize\": \"800 Gb\",\n    \"FreeSize\": \"413 Gb\",\n    \"Free\": \"52 %\"\n  },\n  {\n    \"Logical_Disk\": \"G:\",\n    \"FileSystem\": \"FAT32\",\n    \"VolumeName\": \"Google Drive\",\n    \"AllSize\": \"100 Gb\",\n    \"FreeSize\": \"42 Gb\",\n    \"Free\": \"42 %\"\n  }\n]\n```\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/disk/iops`\n\n```JSON\n[\n  {\n    \"Name\": \"0 D: C:\",\n    \"ReadWriteTime\": \"0 %\",\n    \"ReadTime\": \"0 %\",\n    \"WriteTime\": \"0 %\",\n    \"IdleTime\": \"99 %\",\n    \"QueueLength\": 0,\n    \"BytesPersec\": \"0,000 MByte/Sec\",\n    \"ReadBytesPersec\": \"0,000 MByte/Sec\",\n    \"WriteBytesPersec\": \"0,000 MByte/Sec\",\n    \"IOps\": 0,\n    \"ReadsIOps\": 0,\n    \"WriteIOps\": 0\n  },\n  {\n    \"Name\": \"_Total\",\n    \"ReadWriteTime\": \"0 %\",\n    \"ReadTime\": \"0 %\",\n    \"WriteTime\": \"0 %\",\n    \"IdleTime\": \"99 %\",\n    \"QueueLength\": 0,\n    \"BytesPersec\": \"0,000 MByte/Sec\",\n    \"ReadBytesPersec\": \"0,000 MByte/Sec\",\n    \"WriteBytesPersec\": \"0,000 MByte/Sec\",\n    \"IOps\": 0,\n    \"ReadsIOps\": 0,\n    \"WriteIOps\": 0\n  }\n]\n```\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/disk/smart`\n\n```JSON\n{\n  \"DiskName\": \"WD PC SN740 SDDPNQD-1T00-1027\",\n  \"Temperature\": 61,\n  \"HealthStatus\": \"Healthy\",\n  \"OperationalStatus\": \"OK\",\n  \"MediaType\": \"SSD\",\n  \"BusType\": \"NVMe\",\n  \"PowerOnHours\": null,\n  \"StartStopCycleCount\": null\n}\n```\n\n## Network interface stats\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/network/interface/stat/current`\n\n```JSON\n{\n  \"Name\": \"Intel[R] Wi-Fi 6E AX211 160MHz\",\n  \"Total\": \"0,087 MByte/Sec\",\n  \"Received\": \"0,063 MByte/Sec\",\n  \"Sent\": \"0,024 MByte/Sec\",\n  \"PacketsPersec\": 416,\n  \"PacketsReceivedPersec\": 189,\n  \"PacketsReceivedUnicastPersec\": 189,\n  \"PacketsReceivedNonUnicastPersec\": 0,\n  \"PacketsReceivedDiscarded\": 0,\n  \"PacketsReceivedErrors\": 0,\n  \"PacketsSentPersec\": 226,\n  \"PacketsSentUnicastPersec\": 226,\n  \"PacketsSentNonUnicastPersec\": 0\n}\n```\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/network/interface/stat/total`\n\n```JSON\n{\n  \"Name\": \"Intel[R] Wi-Fi 6E AX211 160MHz\",\n  \"Total\": \"4,73 GByte\",\n  \"Received\": \"4,36 GByte\",\n  \"Sent\": \"0,37 GByte\",\n  \"PacketsPersec\": 9163133,\n  \"PacketsReceivedPersec\": 5580358,\n  \"PacketsReceivedUnicastPersec\": 5540535,\n  \"PacketsReceivedNonUnicastPersec\": 39823,\n  \"PacketsReceivedDiscarded\": 0,\n  \"PacketsReceivedErrors\": 0,\n  \"PacketsSentPersec\": 3582775,\n  \"PacketsSentUnicastPersec\": 3572843,\n  \"PacketsSentNonUnicastPersec\": 9932\n}\n```\n\n### Network stats and IP configuration\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/network/stat | jq .[-1]`\n\n```JSON\n{\n  \"ProcessName\": \"svchost\",\n  \"LocalAddress\": \"0.0.0.0\",\n  \"LocalPort\": 135,\n  \"RemotePort\": 0,\n  \"RemoteHostName\": \"\",\n  \"RemoteAddress\": \"0.0.0.0\",\n  \"State\": 2,\n  \"CreationTime\": \"2024-02-03T01:08:07+03:00\",\n  \"RunTime\": \"3.16:47:13\",\n  \"ProcessPath\": \"C:\\\\Windows\\\\system32\\\\svchost.exe\"\n}\n```\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/network/ipconfig | jq .[-1]`\n\n```JSON\n{\n  \"Description\": \"Hyper-V Virtual Ethernet Adapter #2\",\n  \"IPAddress\": \"172.22.48.1 fe80::1637:f6c9:59b9:dc6f\",\n  \"GatewayDefault\": \"\",\n  \"Subnet\": \"255.255.240.0 64\",\n  \"DNSServer\": \"\",\n  \"MACAddress\": \"00:15:5D:CB:0C:CD\",\n  \"DHCPEnabled\": false,\n  \"DHCPServer\": null,\n  \"DHCPLeaseObtained\": null,\n  \"DHCPLeaseExpires\": null\n}\n```\n\n### Driver, software and Windows update\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/driver | jq .[-1]`\n\n```JSON\n{\n  \"DriverProviderName\": \"WireGuard LLC\",\n  \"FriendlyName\": \"ProtonVPN Tunnel\",\n  \"Description\": \"Wintun Userspace Tunnel\",\n  \"DriverVersion\": \"0.13.0.0\",\n  \"DriverDate\": \"2021-02-08T03:00:00+03:00\"\n}\n```\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/software | jq .[-2]`\n\n```JSON\n{\n  \"Name\": \"ILSpy\",\n  \"Version\": \"8.0.0.7345\",\n  \"Vendor\": \"ICSharpCode Team\",\n  \"InstallDate\": \"16.10.2023\",\n  \"InstallLocation\": null,\n  \"InstallSource\": \"D:\\\\Install\\\\IDE\\\\.NET\\\\\",\n  \"PackageName\": \"ILSpy-8.0.0.7345.msi\",\n  \"LocalPackage\": \"C:\\\\Windows\\\\Installer\\\\21787.msi\"\n}\n```\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/update | jq .[0]`\n\n```JSON\n{\n  \"HotFixID\": \"KB5033918\",\n  \"InstallDate\": \"13.01.2024\",\n  \"Description\": \"Update\",\n  \"InstalledBy\": \"NT AUTHORITY\\\\СИСТЕМА\"\n}\n```\n\n### File system\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/files -H \"Path: D:/Movies\"`\n\n```JSON\n[\n  {\n    \"Name\": \"МДЖ-03\",\n    \"FullName\": \"D:\\\\Movies\\\\МДЖ-03\",\n    \"Type\": \"Directory\",\n    \"Size\": \"14.243 GB\",\n    \"Files\": 9,\n    \"Directory\": 0,\n    \"CreationTime\": \"25.10.2023 03:58:41\",\n    \"LastAccessTime\": \"02.02.2024 02:45:19\",\n    \"LastWriteTime\": \"25.10.2023 04:05:22\"\n  },\n  {\n    \"Name\": \"Adventure-Time\",\n    \"FullName\": \"D:\\\\Movies\\\\Adventure-Time\",\n    \"Type\": \"Directory\",\n    \"Size\": \"61.73 GB\",\n    \"Files\": 292,\n    \"Directory\": 11,\n    \"CreationTime\": \"04.05.2023 10:05:23\",\n    \"LastAccessTime\": \"02.02.2024 02:45:19\",\n    \"LastWriteTime\": \"04.05.2023 10:06:22\"\n  },\n  {\n    \"Name\": \"Prikluchenie-Dsheki-Chana\",\n    \"FullName\": \"D:\\\\Movies\\\\Prikluchenie-Dsheki-Chana\",\n    \"Type\": \"Directory\",\n    \"Size\": \"22.862 GB\",\n    \"Files\": 95,\n    \"Directory\": 0,\n    \"CreationTime\": \"10.07.2023 10:00:55\",\n    \"LastAccessTime\": \"02.02.2024 02:45:19\",\n    \"LastWriteTime\": \"10.07.2023 10:03:28\"\n  },\n  {\n    \"Name\": \"Shaman-King\",\n    \"FullName\": \"D:\\\\Movies\\\\Shaman-King\",\n    \"Type\": \"Directory\",\n    \"Size\": \"15.123 GB\",\n    \"Files\": 64,\n    \"Directory\": 0,\n    \"CreationTime\": \"10.07.2023 10:03:10\",\n    \"LastAccessTime\": \"02.02.2024 02:45:19\",\n    \"LastWriteTime\": \"10.07.2023 10:07:01\"\n  },\n  {\n    \"Name\": \"The-Cleaner-S02\",\n    \"FullName\": \"D:\\\\Movies\\\\The-Cleaner-S02\",\n    \"Type\": \"Directory\",\n    \"Size\": \"7.829 GB\",\n    \"Files\": 6,\n    \"Directory\": 0,\n    \"CreationTime\": \"25.10.2023 03:47:32\",\n    \"LastAccessTime\": \"02.02.2024 02:45:19\",\n    \"LastWriteTime\": \"25.10.2023 03:51:10\"\n  },\n  {\n    \"Name\": \"The-Flash\",\n    \"FullName\": \"D:\\\\Movies\\\\The-Flash\",\n    \"Type\": \"Directory\",\n    \"Size\": \"76.569 GB\",\n    \"Files\": 43,\n    \"Directory\": 2,\n    \"CreationTime\": \"30.07.2023 01:13:20\",\n    \"LastAccessTime\": \"02.02.2024 02:45:06\",\n    \"LastWriteTime\": \"30.07.2023 03:22:09\"\n  }\n]\n```\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/files -H \"Path: D:/Movies/The-Flash\"`\n\nThere are 20 files in the season 4 directory:\n\n```JSON\n[\n  {\n    \"Name\": \"3 sezon\",\n    \"FullName\": \"D:\\\\Movies\\\\The-Flash\\\\3 sezon\",\n    \"Type\": \"Directory\",\n    \"Size\": \"41.01 GB\",\n    \"Files\": 23,\n    \"Directory\": 0,\n    \"CreationTime\": \"30.07.2023 01:13:20\",\n    \"LastAccessTime\": \"02.02.2024 02:08:32\",\n    \"LastWriteTime\": \"30.07.2023 01:14:37\"\n  },\n  {\n    \"Name\": \"4 sezon\",\n    \"FullName\": \"D:\\\\Movies\\\\The-Flash\\\\4 sezon\",\n    \"Type\": \"Directory\",\n    \"Size\": \"35.559 GB\",\n    \"Files\": 20,\n    \"Directory\": 0,\n    \"CreationTime\": \"30.07.2023 01:22:15\",\n    \"LastAccessTime\": \"02.02.2024 02:08:32\",\n    \"LastWriteTime\": \"18.12.2023 12:00:37\"\n  }\n]\n```\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/files -H \"Path: D:/Movies/The-Flash/4 sezon/The.Flash.S04E20.1080p.rus.LostFilm.TV.mkv\"`\n\n```JSON\n{\n  \"Name\": \"The.Flash.S04E20.1080p.rus.LostFilm.TV.mkv\",\n  \"FullName\": \"D:\\\\Movies\\\\The-Flash\\\\4 sezon\\\\The.Flash.S04E20.1080p.rus.LostFilm.TV.mkv\",\n  \"Type\": \"File\",\n  \"Size\": \"1.786 GB\",\n  \"Files\": 0,\n  \"Directory\": 0,\n  \"CreationTime\": \"30.07.2023 03:06:02\",\n  \"LastAccessTime\": \"17.12.2023 11:45:02\",\n  \"LastWriteTime\": \"30.07.2023 03:07:19\"\n}\n```\n\n❌ We're deleting episode 20 of the serial:\n\n`curl -s -X POST -u $user:$pass -data '' http://192.168.3.99:8443/api/file-delete -H \"Path: D:/Movies/The-Flash/4 sezon/The.Flash.S04E20.1080p.rus.LostFilm.TV.mkv\"`\n\n```\nDeleted successfully: D:/Movies/The-Flash/4 sezon/The.Flash.S04E20.1080p.rus.LostFilm.TV.mkv (File).\n```\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/files -H \"Path: D:/Movies/The-Flash/4 sezon/The.Flash.S04E20.1080p.rus.LostFilm.TV.mkv\"`\n\n```\nBad Request. Path  could not be found.\n```\n\n`curl -s -X GET -u $user:$pass http://192.168.3.99:8443/api/files -H \"Path: D:/Movies/The-Flash\"`\n\nThere are now 19 files in the Season 4 catalog:\n\n```JSON\n[\n  {\n    \"Name\": \"3 sezon\",\n    \"FullName\": \"D:\\\\Movies\\\\The-Flash\\\\3 sezon\",\n    \"Type\": \"Directory\",\n    \"Size\": \"41.01 GB\",\n    \"Files\": 23,\n    \"Directory\": 0,\n    \"CreationTime\": \"30.07.2023 01:13:20\",\n    \"LastAccessTime\": \"02.02.2024 02:45:06\",\n    \"LastWriteTime\": \"30.07.2023 01:14:37\"\n  },\n  {\n    \"Name\": \"4 sezon\",\n    \"FullName\": \"D:\\\\Movies\\\\The-Flash\\\\4 sezon\",\n    \"Type\": \"Directory\",\n    \"Size\": \"33.773 GB\",\n    \"Files\": 19,\n    \"Directory\": 0,\n    \"CreationTime\": \"30.07.2023 01:22:15\",\n    \"LastAccessTime\": \"02.02.2024 02:45:06\",\n    \"LastWriteTime\": \"18.12.2023 12:00:37\"\n  }\n]\n```\n\n## 📑 Server log\n\nExample of logging different clients: `Google Chrome`, `PowerShell (Invoke-RestMethod)` and `curl`.\n\n```PowerShell\nPS C:\\Users\\lifailon\\Documents\\Git\\WinAPI\u003e . 'C:\\Users\\lifailon\\Documents\\Git\\WinAPI\\WinAPI\\WinAPI-0.3.ps1'\nRunning on port 8443\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/service =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/process =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET / =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /service =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e POST /api/service/WinRM =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /service =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e POST /api/service/WinRM =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /service =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /process =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e POST /api/process/qbittorrent =\u003e 200\n192.168.3.99:49829 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e POST /api/process/ =\u003e 405\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /process =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e POST /api/process/qbittorrent =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /process =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/hardware =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/performance =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/performance =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/cpu =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/cpu =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/cpu =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/cpu =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/cpu =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/memory =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/memory =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/memory =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/memory =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/disk/physical =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/disk/logical =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/disk/iops =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/disk/iops =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/disk/iops =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/disk/iops =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/disk/iops =\u003e 200\n192.168.3.99:49843 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 =\u003e GET /api/video =\u003e 200\n192.168.3.100:55137 Mozilla/5.0 (Windows NT 10.0; Microsoft Windows 10.0.19045; ru-RU) PowerShell/7.3.7 =\u003e GET /api/service =\u003e 200\n192.168.3.100:55147 Mozilla/5.0 (Windows NT 10.0; Microsoft Windows 10.0.19045; ru-RU) PowerShell/7.3.7 =\u003e POST /api/service/winrm =\u003e 200\n192.168.3.100:55152 Mozilla/5.0 (Windows NT 10.0; Microsoft Windows 10.0.19045; ru-RU) PowerShell/7.3.7 =\u003e POST /api/service/winrm =\u003e 200\n192.168.3.100:55175 Mozilla/5.0 (Windows NT 10.0; Microsoft Windows 10.0.19045; ru-RU) PowerShell/7.3.7 =\u003e GET /api/service =\u003e 200\n192.168.3.100:55181 Mozilla/5.0 (Windows NT 10.0; Microsoft Windows 10.0.19045; ru-RU) PowerShell/7.3.7 =\u003e POST /api/service/winrm =\u003e 200\n192.168.3.101:44112 curl/7.81.0 =\u003e GET /api/service/win =\u003e 200\n192.168.3.101:44120 curl/7.81.0 =\u003e GET /api/service/winrm =\u003e 200\n192.168.3.101:39642 curl/7.81.0 =\u003e POST /api/process/qbittorrent =\u003e 200\n192.168.3.101:46296 curl/7.81.0 =\u003e POST /api/process/qbittorrent =\u003e 200\n```","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flifailon%2Fwinapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flifailon%2Fwinapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flifailon%2Fwinapi/lists"}