创建SalesForce用户时出错LICENSE_LIMIT_EXCEEDED:超出许可限制

时间:2012-09-26 13:17:07

标签: api soap salesforce

我想通过使用SOAP API以编程方式创建5-6个SalesForce用户。我正在使用Partner API,我有一个Developer Edition沙箱。我正在从数据库表中检索用户信息,然后使用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

这些是可用的许可证数量:enter image description here

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

这些是SalesForce中的用户: enter image description here

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

2 个答案:

答案 0 :(得分: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"));
    }
}

答案 1 :(得分:2)

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

  • 'SFDC':完整的Salesforce许可证
  • 'CSN_User':Chatter Free许可证
  • 'AUL':Salesforce Platform许可证

(要了解更多信息,请在UserLicense对象上执行“全部查询”)。

因此,您需要查询有关可用许可类型的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"));
}