使用 Google Directory API 未找到组织单元

Posted

技术标签:

【中文标题】使用 Google Directory API 未找到组织单元【英文标题】:OrgUnit Not Found using Google Directory API 【发布时间】:2015-07-02 17:34:10 【问题描述】:

程序

我要去:1.从 Google Directory API 获取 OrgUnit 2. 读取 OrgUnit 并收集所需的数据 3. 尝试删除我刚刚收集的 OrgUnit。 这会导致 404 [Not Found] 错误请记住,我正在使用的 DirectoryService 类工作正常。我修改了此示例中的代码以使其易于阅读,例如:不包括异常处理等。

API

using Google.Apis.Admin.Directory.directory_v1

1.从 Google Directory API 获取组织单位

DirectoryService directoryService = ServiceInitializers.InitializeDirectoryService();
OrgUnit oUnit = directoryService.Orgunits.List(Settings.customerId).Execute().OrganizationUnits.FirstOrDefault();

2.读取组织单元并收集所需数据

string orgUnitPath = oUnit.OrgUnitPath;

3.尝试删除我刚刚收集的OrgUnit

var orgUnitDeleteResult = directoryService.Orgunits.Delete(Settings.customerId, orgUnitPath).Execute();

例外

GoogleApiException 未处理Google.Apis.dll 中出现“Google.GoogleApiException”类型的未处理异常 附加信息:Google.Apis.Requests.RequestError 未找到单位部门 [404]

【问题讨论】:

您似乎在使用 FirstOrDefault(),如果域中实际上没有组织单位,它可能会给您一个空对象。您能否确认 orgUnitPath 已填充且不为空? 在这种情况下,第 2 步会给我一个 NullReferenceException 不一定是尼克。也许 OrganisationUnits 的 default 值是某种形式的包含空集合的对象。它可能不是 null,它可能意味着 orgUnitPath 返回一个空字符串或 null 值。你能证实吗?查看examples on Enumerable.FirstOrDefault 中的空数组。 对不起...我对 API 不够熟悉,无法提供任何更有用的答案。我建议尝试的一件事是查看the delete API doco,因为您似乎可以尝试通过网站删除。在使用 Fiddler 监控流量的同时尝试一下,看看 HTTP 请求/响应中是否还有其他内容可以提供一些关于为什么找不到它的信息。 我确实注意到 at this link 它声明 “您只能删除没有任何子组织单位或分配给它们的任何用户的组织单位。您需要将用户重新分配给其他组织单位并在删除之前删除任何子组织单位。” 也许检查并确认不是这种情况。也许您看到的错误是针对这样的一系列条件的通用错误。希望您无论如何都能找到答案。 【参考方案1】:

我的声誉不够高,无法在发布答案之前添加评论以获得澄清,所以我必须在这里做出一些假设。

第一个假设是您使用服务帐户来访问 API。

第二个假设是,您已从 Google 管理控制面板获得证书,这一切正常。

当我通过 API 更新用户帐户时,我遇到了类似的问题,为我解决的问题是让目录管理员帐户充当服务帐户的代表。

这是我用来初始化我的 Google 目录服务的代码。

private static DirectoryService initializeGoogleDirectoryService()

    try
    
        String serviceAccountEmail = "your_service_account_email@developer.gserviceaccount.com";

        var certificate = new X509Certificate2(@"your_certificate_name.p12", "your_secret", X509KeyStorageFlags.Exportable);

        // For the service account to work, a user with admin privs must be assigned as the delegate.
        ServiceAccountCredential credential = new ServiceAccountCredential(
           new ServiceAccountCredential.Initializer(serviceAccountEmail)
           
               // Change the scope here to the one you need to modify org units.
               Scopes = new[]  DirectoryService.Scope.AdminDirectoryUser ,
               User = "administrator_account@your_google_apps_domain.com"
           .FromCertificate(certificate));

        // Create the service.
        var service = new DirectoryService(new BaseClientService.Initializer()
        
            HttpClientInitializer = credential,
            ApplicationName = "Your_Application_Name"
        );

        return service;
    
    catch (Exception ex)
    
        // Exception handling code below.
        return null;
    
    finally
     
    

【讨论】:

以上是关于使用 Google Directory API 未找到组织单元的主要内容,如果未能解决你的问题,请参考以下文章

Google_Service_Directory - (403) 无权访问此资源/api

无法使用 Google Directory API Admin SDK 列出用户

Google Directory API:使用服务帐户检索用户信息时出现 403

周末 Google Directory API 发生了啥变化/中断?

Azure Active Directory 为 API 管理灾难恢复抛出“未实现”

访问未配置。您的项目未启用 API (Google+ API)。请使用 Google Developers Console 更新您的配置