diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebRequestPSCmdlet.Common.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebRequestPSCmdlet.Common.cs
index 7a784a1e495..f1a455974b9 100644
--- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebRequestPSCmdlet.Common.cs
+++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/Common/WebRequestPSCmdlet.Common.cs
@@ -1995,7 +1995,7 @@ private static StreamContent GetMultipartStreamContent(object fieldName, Stream
/// The file to use for the
private static StreamContent GetMultipartFileContent(object fieldName, FileInfo file)
{
- StreamContent result = GetMultipartStreamContent(fieldName: fieldName, stream: new FileStream(file.FullName, FileMode.Open));
+ StreamContent result = GetMultipartStreamContent(fieldName: fieldName, stream: new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.Read));
result.Headers.ContentDisposition.FileName = file.Name;
result.Headers.ContentDisposition.FileNameStar = file.Name;
diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1
index 1ddb9f10ba9..7c0fffa5c4a 100644
--- a/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1
+++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/WebCmdlets.Tests.ps1
@@ -1727,6 +1727,26 @@ Describe "Invoke-WebRequest tests" -Tags "Feature", "RequireAdminOnWindows" {
$result.Files[0].Content | Should -Match $file1Contents
}
+ It "Verifies Invoke-WebRequest -Form supports read-only file values" {
+ # Create a read-only test file
+ $readOnlyFile = Join-Path $TestDrive "readonly-test.txt"
+ "ReadOnly test content" | Out-File -FilePath $readOnlyFile -Encoding utf8
+ Set-ItemProperty -Path $readOnlyFile -Name IsReadOnly -Value $true
+
+ $form = @{TestFile = [System.IO.FileInfo]$readOnlyFile}
+ $uri = Get-WebListenerUrl -Test 'Multipart'
+ $response = Invoke-WebRequest -Uri $uri -Form $form -Method 'POST'
+ $result = $response.Content | ConvertFrom-Json
+
+ $result.Headers.'Content-Type' | Should -Match 'multipart/form-data'
+ $result.Files.Count | Should -Be 1
+
+ $result.Files[0].Name | Should -BeExactly "TestFile"
+ $result.Files[0].FileName | Should -BeExactly "readonly-test.txt"
+ $result.Files[0].ContentType | Should -BeExactly 'application/octet-stream'
+ $result.Files[0].Content | Should -Match "ReadOnly test content"
+ }
+
It "Verifies Invoke-WebRequest -Form sets Content-Disposition FileName and FileNameStar." {
$ContentDisposition = [System.Net.Http.Headers.ContentDispositionHeaderValue]::new("attachment")
$ContentDisposition.FileName = $fileName
@@ -3568,6 +3588,25 @@ Describe "Invoke-RestMethod tests" -Tags "Feature", "RequireAdminOnWindows" {
$result.Files[0].Content | Should -Match $file1Contents
}
+ It "Verifies Invoke-RestMethod -Form supports read-only file values" {
+ # Create a read-only test file
+ $readOnlyFile = Join-Path $TestDrive "readonly-test.txt"
+ "ReadOnly test content" | Out-File -FilePath $readOnlyFile -Encoding utf8
+ Set-ItemProperty -Path $readOnlyFile -Name IsReadOnly -Value $true
+
+ $form = @{TestFile = [System.IO.FileInfo]$readOnlyFile}
+ $uri = Get-WebListenerUrl -Test 'Multipart'
+ $result = Invoke-RestMethod -Uri $uri -Form $form -Method 'POST'
+
+ $result.Headers.'Content-Type' | Should -Match 'multipart/form-data'
+ $result.Files.Count | Should -Be 1
+
+ $result.Files[0].Name | Should -Be "TestFile"
+ $result.Files[0].FileName | Should -Be "readonly-test.txt"
+ $result.Files[0].ContentType | Should -Be 'application/octet-stream'
+ $result.Files[0].Content | Should -Match "ReadOnly test content"
+ }
+
It "Verifies Invoke-RestMethod -Form sets Content-Disposition FileName and FileNameStar." {
$ContentDisposition = [System.Net.Http.Headers.ContentDispositionHeaderValue]::new("attachment")
$ContentDisposition.FileName = $fileName