Search code examples
c#uwpwin-universal-appraspberry-pi3windows-10-iot-core

Windows 10 IoT Core remove WiFi profile programatically


I need to remove a saved wifi profilefrom code, so that the SoftAP is enabled again. According to the ms docs, there is no way to remove a profile, only disconnect. Is this not possible?

Ms docs for wifi https://learn.microsoft.com/en-us/uwp/api/windows.devices.wifi.wifiadapter

Device Portal API https://learn.microsoft.com/de-ch/windows/mixed-reality/device-portal-api-reference#wifi-management

Here is my working code for disconnecting from a wifi using device portal API

        // API creds
        string username = "Administrator";
        string password = "p@ssw0rd

        // API request URIs
        string apiUri = "http://192.168.1.15:8080/api/wifi/network";

        // WiFi details
        string wifiInterface = string.Empty;
        string wifiProfile = string.Empty;

        // WiFi access
        WiFiAccessStatus wifiAccess = await WiFiAdapter.RequestAccessAsync();

        if (wifiAccess == WiFiAccessStatus.Allowed)
        {
            // Get WiFi adapter
            IReadOnlyList<WiFiAdapter> wifiAdapterResult = await WiFiAdapter.FindAllAdaptersAsync();
            WiFiAdapter wifiAdapter = wifiAdapterResult[0];

            // Get conn profile / details
            ConnectionProfile profile = await wifiAdapter.NetworkAdapter.GetConnectedProfileAsync();
            wifiInterface = profile.NetworkAdapter.NetworkAdapterId.ToString();
            wifiProfile = profile.ProfileName;
        }

        // API creds
        PasswordCredential credentials = new PasswordCredential("login", username, password);

        // HttpClient filter
        HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter();
        filter.CookieUsageBehavior = HttpCookieUsageBehavior.NoCookies;
        filter.CacheControl.ReadBehavior = HttpCacheReadBehavior.MostRecent;
        filter.CacheControl.WriteBehavior = HttpCacheWriteBehavior.NoCache;
        filter.ServerCredential = credentials;

        // HttpClient
        HttpClient client = new HttpClient(filter);

        apiUri = apiUri + "?interface=" + wifiInterface + "&op=disconnect" + "&createprofile=no";

        // Request
        HttpRequestMessage request = new HttpRequestMessage();
        request.Method = new HttpMethod("POST");
        request.RequestUri = new Uri(apiUri);

        // Send request
        try
        {
            // Response
            HttpResponseMessage response = await client.SendRequestAsync(request);

            // Again
            if (response.Content.ToString().Contains("Authorization Required"))
            {
                response = await client.SendRequestAsync(request);
            }
        }
        catch
        {
            // Dispose
            client.Dispose();
            filter.Dispose();
        }

But for deleting a wifi profile, i get 404 not found back from the API. According to the API docs linked above, the request should be ok. Here is my code for deleting a wifi profile

        // API creds
        string username = "Administrator";
        string password = "p@ssw0rd

        // API request URIs
        string apiUri = "http://192.168.1.15:8080/api/wifi/network";

        // WiFi details
        string wifiInterface = string.Empty;
        string wifiProfile = string.Empty;

        // WiFi access
        WiFiAccessStatus wifiAccess = await WiFiAdapter.RequestAccessAsync();

        if (wifiAccess == WiFiAccessStatus.Allowed)
        {
            // Get WiFi adapter
            IReadOnlyList<WiFiAdapter> wifiAdapterResult = await WiFiAdapter.FindAllAdaptersAsync();
            WiFiAdapter wifiAdapter = wifiAdapterResult[0];

            // Get conn profile / details
            ConnectionProfile profile = await wifiAdapter.NetworkAdapter.GetConnectedProfileAsync();
            wifiInterface = profile.NetworkAdapter.NetworkAdapterId.ToString();
            wifiProfile = profile.ProfileName;
        }

        // API creds
        PasswordCredential credentials = new PasswordCredential("login", username, password);

        // HttpClient filter
        HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter();
        filter.CookieUsageBehavior = HttpCookieUsageBehavior.NoCookies;
        filter.CacheControl.ReadBehavior = HttpCacheReadBehavior.MostRecent;
        filter.CacheControl.WriteBehavior = HttpCacheWriteBehavior.NoCache;
        filter.ServerCredential = credentials;

        // HttpClient
        HttpClient client = new HttpClient(filter);

        apiUri = apiUri + "?interface=" + wifiInterface + "&profile=" + wifiProfile;

        // Request
        HttpRequestMessage request = new HttpRequestMessage();
        request.Method = new HttpMethod("DELETE")
        request.RequestUri = new Uri(apiUri);

        // Send request
        try
        {
            // Response
            HttpResponseMessage response = await client.SendRequestAsync(request);

            // Again
            if (response.Content.ToString().Contains("Authorization Required"))
            {
                response = await client.SendRequestAsync(request);
            }
        }
        catch
        {
            // Dispose
            client.Dispose();
            filter.Dispose();
        }

Edit//

To close this problem, since build 17763, there is a new method for deleting WiFi profiles directly from code available

bool canDelete = wifiProfile.CanDelete;
if (canDelete)
{
     ConnectionProfileDeleteStatus deleteStatus = await wifiProfile.TryDeleteAsync();
}

Solution

  • To close this problem, since build 17763, there is a new method for deleting WiFi profiles directly from code available

    bool canDelete = wifiProfile.CanDelete;
    if (canDelete)
    {
         ConnectionProfileDeleteStatus deleteStatus = await wifiProfile.TryDeleteAsync();
    }