You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#应用调用PowerShell脚本时代理配置不生效该如何解决?

问题根因
  • .NET Core 3.1的静态代理配置优先级高于Runspace内的PowerShell脚本配置:你在PowerShell脚本中修改的[System.Net.WebRequest]::DefaultWebProxy仅对当前Runspace内的老版WebRequest类生效,而Microsoft Teams PowerShell模块底层依赖.NET Core的HttpClient栈,默认会读取进程启动时的静态代理配置,不会响应Runspace内的动态修改。
  • 你创建的Runspace默认继承.NET进程的全局网络配置,脚本里的修改没有覆盖到HttpClient使用的全局代理。
解决方案

方法1:在C#进程启动时预先配置全局代理(最稳定)

直接在创建Runspace之前,先在C#代码里配置全局代理,所有后续启动的Runspace和加载的模块都会继承这个配置:

// 放在程序启动入口,创建Runspace之前执行
var proxyAddress = new Uri("http://myproxy:8080");
var webProxy = new WebProxy(proxyAddress)
{
    Credentials = CredentialCache.DefaultNetworkCredentials,
    BypassProxyOnLocal = true
};
// 同时兼容老WebRequest和新HttpClient的全局代理配置
HttpWebRequest.DefaultWebProxy = webProxy;
HttpClient.DefaultProxy = webProxy;

// 后面再执行你原来的Runspace创建逻辑
var Session = InitialSessionState.CreateDefault();
Session.ImportPSModule("MicrosoftTeams");
var pool = RunspaceFactory.CreateRunspacePool(Session);
pool.Open();

这种方式不需要修改PowerShell脚本里的代理配置,直接删掉脚本里的[system.net.webrequest]::DefaultWebProxy相关代码就行,代理会自动生效。

方法2:在PowerShell脚本中同时配置HttpClient的全局代理

如果你不想修改C#代码,只改PowerShell脚本的话,补充HttpClient代理的配置:

$proxyserver = "http://myproxy:8080";

$proxy = New-Object system.net.webproxy($proxyserver)
$proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
# 同时配置老WebRequest和新HttpClient的代理
[system.net.webrequest]::DefaultWebProxy = $proxy
[System.Net.Http.HttpClient]::DefaultProxy = $proxy

# 后面保持原来的Teams连接逻辑不变
$pass = ConvertTo-SecureString "xxxx" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList "user",$pass
Connect-MicrosoftTeams -Credential $cred

这个方法不需要修改C#代码,直接更新你的PowerShell脚本内容即可生效。

方法3:使用Connect-MicrosoftTeams的自带代理参数

Microsoft Teams PowerShell模块的Connect-MicrosoftTeams cmdlet本身提供了-Proxy参数,可以直接指定代理,不需要修改全局配置:

$pass = ConvertTo-SecureString "xxxx" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList "user",$pass
Connect-MicrosoftTeams -Credential $cred -Proxy "http://myproxy:8080" -ProxyUseDefaultCredentials

这个方式最轻量化,只需要修改连接命令的参数即可,不需要全局配置代理。

注意事项
  • 你的C#代码里存在笔误:poo.Open()应该修正为pool.Open(),避免运行时报错。
  • 确保你加载的Microsoft Teams PowerShell模块版本和本地PowerShell会话中使用的版本一致,避免模块版本差异导致的代理不兼容问题。

内容的提问来源于stack exchange,提问作者Rich79

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 02:24:01