4

我想通过使用 SOAP API 以编程方式一次性创建 5-6 个 SalesForce 用户。我正在使用合作伙伴 API,并且我有一个开发人员版沙箱。我正在从数据库表中检索用户信息,然后使用 API 我想一次创建这 5-6 个用户。我可以创建一个用户,但是在创建另一个用户之后它会抛出错误LICENSE_LIMIT_EXCEEDED:License Limit Exceeded

这是我的代码的快照,它从数据库中检索用户信息,然后以编程方式创建用户:

SObject user = new SObject();

user.setType("User");

while (rs.next()) {
    user.setField("Alias", rs.getString("Alias"));
    user.setField("Email", rs.getString("Email"));
    user.setField("EmailEncodingKey", rs.getString("EmailEncodingKey"));
    user.setField("LanguageLocaleKey", "En_US");
    user.setField("LastName", rs.getString("LastName"));
    user.setField("LocaleSidKey", rs.getString("LocaleSidKey"));
    user.setField("TimeZoneSidKey", "America/Los_Angeles");
    user.setField("Username", rs.getString("Username"));
    user.setField("UserPermissionsCallCenterAutoLogin", "false");
    user.setField("UserPermissionsMarketingUser", "false");
    user.setField("UserPermissionsOfflineUser", "false");
    user.setField("ProfileId", connection.getUserInfo().getProfileId());

    SaveResult[] results = connection.create(new SObject[] { user });
    System.out.println("Created user: " + results[0].getId());

    if (results[0].isSuccess())
        out.println("Created user: " + results[0].getId());
    else
        out.println("Error: " + results[0].getErrors()[0].getStatusCode() + 
                           ":" + results[0].getErrors()[0].getMessage());

}

QueryResult queryResults = connection
        .query("SELECT Id, Name from User "
                + "ORDER BY CreatedDate DESC LIMIT 5");

if (queryResults.getSize() > 0) {
    for (SObject s : queryResults.getRecords()) {
        out.println("Id: " + s.getField("Id") + " - Name: "
                + s.getField("Name"));
    }
}

在这里我可以创建一个用户,但是在创建一个用户之后它会抛出错误LICENSE_LIMIT_EXCEEDED:License Limit Exceeded

这些是可用的许可证数量:在此处输入图像描述

我可以看到 SalesForce 的剩余许可证为 0。但是,我只想创建一些不一定是 SalesForce 用户的用户。它可以是应该能够登录到我的组织的任何类型的用户。当我尝试创建一些不同类型的用户时,例如拥有 5000 个许可证的“Chatter Free”,user.setField("UserType", "CsnOnly")它会给出错误INVALID_FIELD_FOR_INSERT_UPDATE:Unable to create/update fields: UserType

这些是我的销售团队中的用户: 在此处输入图像描述

如何解决这个问题呢?我只想从数据库中创建一些用户,然后可以登录到 SalesForce。他们不必是管理员。他们可以拥有最低权限,但他们应该能够登录到 SalesForce。

4

2 回答 2

4

在开发人员组织中,您将不能拥有超过两个具有 Salesforce 许可证的活动用户。为了创建具有 Chatter Free 许可证的用户,您只需为他们分配个人资料Chatter Free User- 它会根据分配给他们的个人资料自动正确设置他们的许可证(该UserType字段不可编辑)。

编辑:要在不对其进行硬编码的情况下获取 Chatter Free 用户的个人资料 ID(因为它可能会从 org 更改为 org),您必须对其进行查询。我修改了您的代码以包含此查询,并对其进行了重新设计,以便只进行一次标注PartnerConnection.create(只是一个建议,因为它将节省您的 SOAP 标注的开销):

QueryResult profileQuery = connection.query("select Id from Profile where Name = 'Chatter Free User' limit 1");
SObject chatterFreeProfile;
if ( profileQuery.getSize() > 0 ) {
    chatterFreeProfile = profileQuery.getRecords()[0];
}

ArrayList<SObject> users = new ArrayList<SObject>();
while (rs.next()) {
    SObject user = new SObject();
    user.setType("User");
    user.setField("Alias", rs.getString("Alias"));
    user.setField("Email", rs.getString("Email"));
    user.setField("EmailEncodingKey", rs.getString("EmailEncodingKey"));
    user.setField("LanguageLocaleKey", "En_US");
    user.setField("LastName", rs.getString("LastName"));
    user.setField("LocaleSidKey", rs.getString("LocaleSidKey"));
    user.setField("TimeZoneSidKey", "America/Los_Angeles");
    user.setField("Username", rs.getString("Username"));
    user.setField("UserPermissionsCallCenterAutoLogin", "false");
    user.setField("UserPermissionsMarketingUser", "false");
    user.setField("UserPermissionsOfflineUser", "false");
    if ( chatterFreeProfile != null )
        user.setField("ProfileId", chatterFreeProfile.getField("Id"));
    else
        user.setField("ProfileId", connection.getUserInfo().getProfileId());
    users.add(user);
}

if ( users.size() > 0 ) {
    SaveResult[] results = connection.create(users.toArray(new SObject[users.size()]));
    for ( int i = 0; i < saveResults.length; i++ ) {
        if (results[i].isSuccess())
            out.println("Created user: " + results[i].getId());
        else
            out.println("Error: " + results[i].getErrors()[0].getStatusCode() + ":" + results[i].getErrors()[0].getMessage());
    }
}

QueryResult queryResults = connection.query("SELECT Id, Name from User ORDER BY CreatedDate DESC LIMIT 5");
if ( queryResults.getSize() > 0 ) {
    for ( SObject s : queryResults.getRecords() ) {
        out.println("Id: " + s.getField("Id") + " - Name: " + s.getField("Name"));
    }
}
于 2012-09-26T14:27:13.613 回答
2

您需要设置ProfileId为与可用许可证类型关联的简档,在您的情况下设置为 Chatter Free、Salesforce 平台上的简档或您的其他可用许可证类型之一。每个配置文件都与特定的 UserLicense 记录相关联,例如:

  • “SFDC”:完整的 Salesforce 许可证
  • “CSN_User”:Chatter 免费许可证
  • “AUL”:Salesforce 平台许可证

(要查看更多信息,请对UserLicense对象执行 Query All)。

因此,您需要查询Profile可用许可证类型的记录,然后将其关联到您的新用户,例如

QueryResult profileQuery = connection.query(
    "SELECT Id FROM Profile "
    + "WHERE UserLicense.Name = 'Chatter Free' LIMIT 1"
);
SObject chatterFreeProfile;
if ( profileQuery.getSize() > 0 ) {
    chatterFreeProfile = profileQuery.getRecords()[0];
    user.setField("ProfileId", chatterFreeProfile.getField("Id"));
}
于 2012-09-26T16:33:33.407 回答