Google API:使用C#的DirectoryService和DriveService的ServiceAccount错误

时间:2016-02-26 23:13:33

标签: c# google-api google-drive-api google-admin-sdk service-accounts

我想要完成的任务:

过去几天我一直在努力将自动化应用到我公司的GoogleApps设置中。我需要暂停已停用超过90天的用户,并在一周之后删除它们。在删除之前,我需要备份其Google云端硬盘中的所有文件。

为什么我还没有完成它:

我尝试过几种不同的方法。首先,我使用Admin SDK与DirectoryServices连接,列出用户,并根据需要暂停。这种接口还允许我在需要时删除用户。现在,我只需要备份他们的Google云端硬盘文件。为此,根据我的理解,我需要一个服务帐户来模拟用户,下载他们的文件,并重新定位它们(​​可能在大容量存储中关闭到服务器)。我不认为这可以作为管理员以编程方式进行,因为我认为UserCredentials需要用户授权我打算通过Drive API手动与每个用户进行交互。另一方面,如果提供了适当的授权,服务帐户应允许我在未经授权的情况下冒充用户。

我创建了ServiceAccount,为其提供了Domain-Wide-Delegation,通过开发者控制台启用了相应的API(Admin SDK,Drive API),并通过Google管理控制台安全设置为服务帐户提供了适当的范围。我认为这是我需要做的所有设置。

    private static async Task<bool> AuthenticateServiceAccount(string serviceAccountEmail, string keyFilePath)
    {
        if (!File.Exists(keyFilePath))  // make sure the file we're looking for actually exists
        {
            Console.WriteLine("Could not find ServAcct key file. Authentication failed!");
            return false;
        }

        string[] scopes = new string[] { DirectoryService.Scope.AdminDirectoryUser, DriveService.Scope.Drive };

        // Generate certificate using our key file
        var certificate = new X509Certificate2(keyFilePath, "notasecret", X509KeyStorageFlags.Exportable);

        try
        {
            // Create our credential from our certificate, using scopes
            ServiceAccountCredential credential = new ServiceAccountCredential(
                new ServiceAccountCredential.Initializer(serviceAccountEmail)
                {
                    Scopes = scopes
                }.FromCertificate(certificate));

            // Create our services

            dirSvc = new DirectoryService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = "GoogleAppAutomation"
            });

            drvSvc = new DriveService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = "GoogleAppAutomation"
            });
        } catch(Exception e)
        {
            Console.WriteLine(e.InnerException);
            return false;
        }

        return true;
    }

我可以使用SA的电子邮件和P12证书在我的代码中验证服务帐户。使用ServiceAccountCredential创建DirectoryService和DriveService对象可以正常工作。但是,当我去访问这些服务时,我遇到的错误是我找不到任何在线帮助。

目录服务

    // Acquire list of active users
    UsersResource.ListRequest req = dirSvc.Users.List();
    req.Customer = "my_customer";
    req.MaxResults = 500;   // 500 is max allowed. Must use paging (.pageToken) for more
    req.OrderBy = UsersResource.ListRequest.OrderByEnum.Email;

    IList<User> users;
    try
    {
        users = req.Execute().UsersValue;   // Execute request for user list
    }
    catch (Exception e)
    {
        throw new Exception("User List Exception", e);
    }

果然,catch块将抛出一个包含以下内容的异常:

Google.Apis.Requests.RequestError
Domain not found. [404]
Errors [
    Message[Domain not found.] Location[ - ] Reason[notFound] Domain[global]
]

DriveService

        FilesResource.ListRequest lr = drvSvc.Files.List();

        IList<Google.Apis.Drive.v2.Data.File> fl = lr.Execute().Items;

        foreach (Google.Apis.Drive.v2.Data.File file in fl)
        {
            Console.WriteLine("{0}", file.Title);
        }

如上所述,Execute()方法抛出异常......

Google.Apis.Requests.RequestError
Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup. [403]
Errors [
    Message[Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.] Location[ - ] Reason[dailyLimitExceededUnreg] Domain[usageLimits]
]

查看开发者控制台,此配额日志中根本没有使用此API。

所以,我想我的问题非常广泛:我做错了什么? :(

编辑:

我认为与Google云端硬盘访问相关的问题与缺少结算设置有关。我还不能确定这一点,因为我的公司很难设置这样的东西。如果有人可以为我确认或否认这一点,那就是帮助!

对于目录服务问题,我只是使用Admin SDK来访问用户进行暂停/删除,以及使用Drive备份的服务帐户。我已经将Admin SDK用于此目的,因此在这方面不需要进一步的帮助(尽管对错误的解释很棒,因为它似乎没有在线记录!)

0 个答案:

没有答案