You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Dynamics CRM插件调用WNetAddConnection2访问网络文件夹报错120(ERROR_CALL_NOT_IMPLEMENTED)求助

解决CRM插件中WNetAddConnection2错误120的问题

首先得明确核心问题:你的本地控制台能跑通,但CRM插件不行,本质是运行环境的差异导致的:

  • 如果是Dynamics 365 Online,插件运行在微软的沙盒环境中,这类系统级的Win32 API(比如WNetAddConnection2)被直接禁用,这就是错误120(函数未实现)的根源。
  • 如果是On-Premises版本,插件默认运行在CRM服务账户的会话里,而WNetAddConnection2是绑定用户会话的函数,服务会话的权限隔离机制会让这个调用失效。

下面给你几个可行的解决方案,按优先级排序:

1. 直接用UNC路径访问网络共享(最推荐)

映射网络驱动器是用户会话级别的操作,完全没必要在插件里做。直接用\\服务器名\共享文件夹这种UNC路径,配合.NET的凭证机制访问,绕开映射步骤。

示例代码:

public void SaveCrmNoteFileToUnc(string uncFolderPath, NetworkCredential credentials, Stream crmNoteFileStream, string targetFileName)
{
    // 创建凭证缓存,绑定到目标UNC路径
    var credentialCache = new CredentialCache();
    credentialCache.Add(new Uri(uncFolderPath), "NTLM", credentials);

    // 通过WebClient将CRM文件流写入UNC路径
    using (var webClient = new WebClient())
    {
        webClient.Credentials = credentialCache;
        var targetFilePath = Path.Combine(uncFolderPath, targetFileName);
        
        using (var fileStream = webClient.OpenWrite(targetFilePath))
        {
            crmNoteFileStream.CopyTo(fileStream);
        }
    }
}

这个方法的优势:

  • 不依赖Win32 API,兼容沙盒和服务会话环境
  • 用原生.NET类库实现,稳定性和可维护性更高

2. Online环境:用Power Automate中转

如果是Dynamics 365 Online,沙盒插件连网络访问都有限制,最稳妥的方式是:

  • 插件仅负责触发Power Automate流,传递必要参数(比如备注文件ID、目标共享路径)
  • 在流中配置网络共享的访问凭证,完成文件下载和保存操作

这种方式完全符合Online环境的安全规则,不需要写复杂的权限代码。

3. On-Premises环境:调整执行上下文和权限(不推荐映射方式)

如果一定要用映射驱动器的方式,可以尝试以下操作:

  • 确保CRM服务账户拥有目标网络共享的读写权限
  • 将插件注册为异步执行(后台模式),异步插件的运行上下文相对宽松,可能允许更多系统调用
  • 修改WNetAddConnection2的调用参数,添加会话兼容的标志:
// 定义所需的常量
const int CONNECT_PERSISTENT = 0x00000001;
const int CONNECT_COMMANDLINE = 0x00000800;

var result = WNetAddConnection2(
    netResource, credentials.Password, userName, 
    CONNECT_PERSISTENT | CONNECT_COMMANDLINE);

注意:这种方式有资源泄漏风险,服务会话的网络映射可能无法被正确清理,长期运行可能出问题。

最后提醒:不管用哪种方案,都要做好错误捕获和日志记录,方便后续排查问题。

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

火山引擎 最新活动