【问题标题】:Google API for getting maximum number of licenses in a Google Apps domain用于在 Google Apps 域中获取最大数量的许可的 Google API
【发布时间】:2015-04-30 07:05:54
【问题描述】:

我有一个 Google Apps 脚本函数,用于为我们的 Google Apps 域中的新员工设置帐户。

它做的第一件事是调用Google Admin Settings API 并检索 currentNumberOfUsersma​​ximumNumberOfUsers,因此它可以查看是否有可用座位(否则后续使用Admin SDK Directory API 创建用户的步骤将失败)。

直到最近我们的域不得不从 Postini 迁移到 Google Vault 以进行电子邮件归档时,它一直运行良好。

迁移之前,当使用 Admin SDK Directory API 创建 Google Apps 用户时,它会将 currentNumberOfUsers 增加 1,新的用户帐户用户将自动有权访问所有 Google Apps 服务。

现在迁移后,在创建 Google Apps 用户时,不会自动为他们分配“许可证”,因此我修改了我的脚本以使用 @987654324 @ 现在它分配了一个"Google-Apps-For-Business" 许可证。效果很好。

但是,currentNumberOfUsers 现在与分配的许可证数量不同"Google-Apps-For-Business" 只是one of several different types of licenses available。 p>

我可以通过运行以下命令获得当前分配 "Google-Apps-For-Business" 许可证的数量:

var currentXml = AdminLicenseManager.LicenseAssignments.listForProductAndSku('Google-Apps', 'Google-Apps-For-Business', 'domain.com', {maxResults: 1000});
    
var current = currentXml.items.toString().match(/\/sku\/Google-Apps-For-Business\/user\//g).length;

但产生的数字与 currentNumberOfUsers 不同。

我现在真正需要做的就是获得 最大 个拥有的 "Google-Apps-For-Business" 许可证,以便新的员工设置脚本可以确定是否有可用的许可证。

我查看了以下 API 的 API 参考文档,但是...

Enterprise License Manager API → 没有获取最大或可用许可证数量的方法。

Google Admin Settings API → 不处理许可证,只处理“用户”。

Admin SDK Directory API User resource → 不处理许可证。

Google Apps Reseller API → 这个API似乎有我需要的,但是it's only for Reseller accounts

我知道我可以对我的新员工设置脚本进行编程,让它只进行一次尝试/捕获,看看它是否能够创建用户并分配许可证,如果不能,则优雅地结束脚本执行,但这并没有似乎效率不高。

此外,旧脚本的一部分是,如果可用座位少于 X,它会通过电子邮件提醒我订购更多。我可以编写一个循环,尝试重复创建虚拟用户并为他们分配许可证,并在失败之​​前计算它可以执行此操作的次数,然后删除所有虚拟用户,但再一次,这根本没有效率。

有什么想法吗?

2020 年 3 月 11 日更新:自从几年前 Admin Settings API 关闭以来,我一直在使用 Enterprise License Manager API 来获取当前使用的许可证数量,如下所示:

function getCurrentNumberOfUsedGoogleLicenses(skuId) {

  var success = false, error = null, count = 0;

  var adminEmail = 'admin@domain.com';
  var gSuiteDomain = adminEmail.split('@')[1];

  // for more information on the domain-wide delegation:
  // https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority
  // the getDomainWideDelegationService() function uses this: 
  // https://github.com/gsuitedevs/apps-script-oauth2
  var service = getDomainWideDelegationService('EnterpriseLicenseManager: ', 'https://www.googleapis.com/auth/apps.licensing', adminEmail);

  if (skuId == 'Google-Apps-Unlimited') var productId = 'Google-Apps';
  else                                  return { success: success, error: "Unsupported skuId", count: count };

  var requestBody                = {};
  requestBody.headers            = {'Authorization': 'Bearer ' + service.getAccessToken()};
  requestBody.method             = "GET";
  requestBody.muteHttpExceptions = false;

  var data, pageToken, pageTokenString;

  var maxAttempts     = 5;
  var currentAttempts = 0;
  var pauseBetweenAttemptsSeconds = 3;

  loopThroughPages:
  do {

    if (typeof pageToken === 'undefined') pageTokenString = "";
    else                                  pageTokenString = "&pageToken=" + encodeURIComponent(pageToken);

    var url = 'https://www.googleapis.com/apps/licensing/v1/product/' + productId + '/sku/' + skuId + '/users?maxResults=1000&customerId=' + gSuiteDomain + pageTokenString;

    try {

      currentAttempts++;

      var response = UrlFetchApp.fetch(url, requestBody);

      var result = JSON.parse(response.getContentText());

      if (result.items) {

        var licenseAssignments = result.items;
        var licenseAssignmentsString = '';

        for (var i = 0; i < licenseAssignments.length; i++) {

          licenseAssignmentsString += JSON.stringify(licenseAssignments[i]);

        }

        if (skuId == 'Google-Apps-Unlimited') count += licenseAssignmentsString.match(/\/sku\/Google-Apps-Unlimited\/user\//g).length;

        currentAttempts = 0; // reset currentAttempts before the next page

      }

    } catch(e) {

      error = "Error: " + e.message;

      if (currentAttempts >= maxAttempts) {

        error = 'Exceeded ' + maxAttempts + ' attempts to get license count: ' + error;

        break loopThroughPages;

      }

    } // end of try catch

    if (result) pageToken = result.nextPageToken;

  } while (pageToken);

  if (!error) success = true;

  return { success: success, error: error, count: count };

}

但是,似乎仍然没有办法使用此 API 获得域可用的最大数量。

【问题讨论】:

  • 似乎唯一的方法是申请将您的帐户设置为经销商。似乎是对 ELM api 的疏忽。
  • 这就是我想的,是的。所以我要申请成为自己的经销商。不幸的是,我认为一个 Google Apps 帐户只能有一个经销商,这意味着我必须放弃我当前的经销商。
  • 2016 年 8 月更新:我们甚至无法获得 currentNumberOfUsers - Google 已宣布他们是 shutting down the Admin Settings API

标签: api google-apps-script google-api google-apps


【解决方案1】:

使用CustomerUsageReports

jay0lee 提供了 Python 中的GAM 源代码。我就这样粗暴地将doGetCustomerInfo()函数改成了Apps Script:

function getNumberOfLicenses() {
  var tryDate = new Date();
  var dateString = tryDate.getFullYear().toString() + "-" + (tryDate.getMonth() + 1).toString() + "-" + tryDate.getDate().toString();
  while (true) {
    try {
      var response = AdminReports.CustomerUsageReports.get(dateString,{parameters : "accounts:gsuite_basic_total_licenses,accounts:gsuite_basic_used_licenses"});
      break;
    } catch(e) {
      //Logger.log(e.warnings.toString());
      tryDate.setDate(tryDate.getDate()-1);
      dateString = tryDate.getFullYear().toString() + "-" + (tryDate.getMonth() + 1).toString() + "-" + tryDate.getDate().toString();
      continue;
    }
  };
  var availLicenseCount = response.usageReports[0].parameters[0].intValue;
  var usedLicenseCount = response.usageReports[0].parameters[1].intValue;
  Logger.log("Available licenses:" + availLicenseCount.toString());
  Logger.log("Used licenses:" + usedLicenseCount.toString());
  return availLicenseCount;
}

【讨论】:

  • 感谢您的建议,但这实际上并没有为我们提供 当前 最大许可数,它只能从管理报告中获取数字,该报告显示来自 2 的数据-4天前。这种报告延迟会导致我们的系统出现问题,因为它需要能够在尝试分配许可证之前实时检查最大数量。
【解决方案2】:

我建议您探索GAM,它是一种工具,可让您通过命令行访问您的域的管理功能。

【讨论】:

  • 看起来很酷,我一定会去看看的。但是,目前无法在 Google Apps 脚本函数中使用它。我必须弄清楚如何调用在可公开访问的服务器上运行的 GAM 并获得实时响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 2023-04-02
  • 2022-10-18
  • 1970-01-01
相关资源
最近更新 更多