我正在尝试使用SQL 2008 R2 Integration Services连接到CRM 2011 - 目标是将数据加载到CRM中。 参考博客MSDN Blog我尝试建立与CRM的连接并将数据加载到其中。
除脚本组件外,一切正常。 这是我的脚本组件中的代码:
public class ScriptMain : UserComponent
{
CrmService service = new CrmService();
public override void PreExecute()
{
base.PreExecute();
CrmService service = new CrmService();
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
service.Url = "http://crm2011dev.myOrg.local/MSCrmServices/2007/CrmService.asmx";
CrmAuthenticationToken token = new CrmAuthenticationToken();
token.OrganizationName = "myOrg";
service.CrmAuthenticationTokenValue = token;
service.PreAuthenticate = true;
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
contact Kontakt = new contact();
Kontakt.firstname = Row.FirstName;
Kontakt.lastname = Row.LastName;
Kontakt.telephone1 = Row.Phone;
Kontakt.emailaddress1 = Row.Email;
service.Create(Kontakt);
}
}
但是当我执行包时,会发生以下错误:
请求失败,HTTP状态为401:未经授权。 在System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage消息,> WebResponse响应,流responseStream,布尔asyncCall) 在System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName,Object [] 参数) 在CRM.Proxy.CrmSdk.CrmService.Create(BusinessEntity实体) 在ScriptMain.Input0_ProcessInputRow(Input0Buffer Row) 在UserComponent.Input0_ProcessInput(Input0Buffer Buffer) 在UserComponent.ProcessInput(Int32 InputID,PipelineBuffer Buffer) 在Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput(Int32 inputID, PipelineBuffer缓冲区)
我认为这不可能,因为运行执行的用户拥有完整的CRM权限(CRM中的系统管理员角色)!
所以我尝试直接在“Input0_ProcessInputRow”部分实现代码:
public class ScriptMain : UserComponent
{
CrmService service = new CrmService();
public override void PreExecute()
{
base.PreExecute();
}
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
// here the part from the PreExecute() section:
CrmService service = new CrmService();
service.Credentials = System.Net.CredentialCache.DefaultCredentials;
service.Url = "http://crm2011dev.myOrg.local/MSCrmServices/2007/CrmService.asmx";
CrmAuthenticationToken token = new CrmAuthenticationToken();
token.OrganizationName = "myOrg";
service.CrmAuthenticationTokenValue = token;
service.PreAuthenticate = true;
contact Kontakt = new contact();
Kontakt.firstname = Row.FirstName;
Kontakt.lastname = Row.LastName;
Kontakt.telephone1 = Row.Phone;
Kontakt.emailaddress1 = Row.Email;
service.Create(Kontakt);
}
}
......它有效! 所以这不是一个简单的权限问题。
似乎脚本组件没有将凭据从“PreExecute”传递到“Input0_ProcessInputRow”......我该如何解决?
有人有想法吗?提前谢谢!
st4ff
答案 0 :(得分:0)
您使用的是默认凭据,那么,使用具有正确权限的CRM用户运行SSIS作业的用户是什么?
作为测试,您可以尝试对凭据进行硬编码。像这样:
service.Credentials = new NetworkCredential("username", "password", "domain");
此外,您使用2007端点是否有任何理由。如果/当您升级到CRM 2013时,它将被弃用?