API เชฆเซเชตเชพเชฐเชพ PowerShell เชฎเชพเช‚เชฅเซ€ Google เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฌเชจเชพเชตเชตเชพ

เชนเซ‡เชฒเซ‹!

เช† เชฒเซ‡เช– G Suite เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเซ‡ เชšเชพเชฒเชพเช•เซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ Google API เชธเชพเชฅเซ‡ เชชเชพเชตเชฐเชถเซ‡เชฒ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพเชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเชถเซ‡.

เช…เชฎเซ‡ เชธเชฎเช—เซเชฐ เชธเช‚เชธเซเชฅเชพเชฎเชพเช‚ เช…เชจเซ‡เช• เช†เช‚เชคเชฐเชฟเช• เช…เชจเซ‡ เช•เซเชฒเชพเช‰เชก เชธเซ‡เชตเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช. เชฎเซ‹เชŸเซ‡เชญเชพเช—เซ‡, เชคเซ‡เชฎเชพเช‚ เช…เชงเชฟเช•เซƒเชคเชคเชพ Google เช…เชฅเชตเชพ เชเช•เซเชŸเชฟเชต เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‡เชจเซ€ เชตเชšเซเชšเซ‡ เช…เชฎเซ‡ เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟ เชœเชพเชณเชตเซ€ เชถเช•เชคเชพ เชจเชฅเซ€; เชคเซ‡ เชฎเซเชœเชฌ, เชœเซเชฏเชพเชฐเซ‡ เช•เซ‹เชˆ เชจเชตเซ‹ เช•เชฐเซเชฎเชšเชพเชฐเซ€ เชœเชพเชฏ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชคเชฎเชพเชฐเซ‡ เช† เชฌเซ‡ เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชเช•เชพเช‰เชจเซเชŸ เชฌเชจเชพเชตเชตเชพ/เชธเช•เซเชฐเชฟเชฏ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เชเช• เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฒเช–เชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ เช›เซ‡ เชœเซ‡ เชฎเชพเชนเชฟเชคเซ€ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชฌเช‚เชจเซ‡ เชธเซ‡เชตเชพเช“เชจเซ‡ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡.

เช…เชงเชฟเช•เซƒเชคเชคเชพ

เช†เชตเชถเซเชฏเช•เชคเชพเช“เชจเซ‡ เชฆเซ‹เชฐเชคเซ€ เชตเช–เชคเซ‡, เช…เชฎเซ‡ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชฎเชพเชŸเซ‡ เชตเชพเชธเซเชคเชตเชฟเช• เชฎเชพเชจเชต เชชเซเชฐเชฌเช‚เชงเช•เซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚; เช† เช†เช•เชธเซเชฎเชฟเช• เช…เชฅเชตเชพ เช‡เชฐเชพเชฆเชพเชชเซ‚เชฐเซเชตเช• เชฎเซ‹เชŸเชพ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ€ เช˜เชŸเชจเชพเชฎเชพเช‚ เช•เซเชฐเชฟเชฏเชพเช“เชจเชพ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชจเซ‡ เชธเชฐเชณ เชฌเชจเชพเชตเซ‡ เช›เซ‡.

Google API เชชเซเชฐเชฎเชพเชฃเซ€เช•เชฐเชฃ เช…เชจเซ‡ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชฎเชพเชŸเซ‡ OAuth 2.0 เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡. เช‰เชชเชฏเซ‹เช—เชจเชพ เช•เซ‡เชธ เช…เชจเซ‡ เชตเชงเซ เชตเชฟเช—เชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ เช…เชนเซ€เช‚ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡: Google API เชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ OAuth 2.0 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹.

เชฎเซ‡เช‚ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชชเชธเช‚เชฆ เช•เชฐเซ€ เช›เซ‡ เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชกเซ‡เชธเซเช•เชŸเซ‹เชช เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธเชฎเชพเช‚ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡. เชธเซ‡เชตเชพ เช–เชพเชคเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ‹ เชตเชฟเช•เชฒเซเชช เชชเชฃ เช›เซ‡, เชœเซ‡เชฎเชพเช‚ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ€ เชฌเชฟเชจเชœเชฐเซ‚เชฐเซ€ เชนเชฟเชฒเชšเชพเชฒเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€.

เชจเซ€เชšเซ‡เชจเซเช‚ เชšเชฟเชคเซเชฐ Google เชชเซƒเชทเซเช  เชชเชฐเชฅเซ€ เชชเชธเช‚เชฆ เช•เชฐเซ‡เชฒ เชฆเซƒเชถเซเชฏเชจเซเช‚ เชฏเซ‹เชœเชจเชพเช•เซ€เชฏ เชตเชฐเซเชฃเชจ เช›เซ‡.

API เชฆเซเชตเชพเชฐเชพ PowerShell เชฎเชพเช‚เชฅเซ€ Google เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“ เชฌเชจเชพเชตเชตเชพ

  1. เชชเซเชฐเชฅเชฎ, เช…เชฎเซ‡ GET เชชเชฐเชฟเชฎเชพเชฃเซ‹เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซ€เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ Google เชเช•เชพเช‰เชจเซเชŸ เชชเซเชฐเชฎเชพเชฃเซ€เช•เชฐเชฃ เชชเซƒเชทเซเช  เชชเชฐ เชฎเซ‹เช•เชฒเซ€เช เช›เซ€เช:
    • เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เช†เชˆเชกเซ€
    • เชเชชเซเชฒเซ€เช•เซ‡เชถเชจเชจเซ‡ เชเช•เซเชธเซ‡เชธเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เชคเซ‡เชตเชพ เชตเชฟเชธเซเชคเชพเชฐเซ‹
    • เชธเชฐเชจเชพเชฎเซเช‚ เช•เซ‡ เชœเซ‡เชจเชพ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชชเซ‚เชฐเซเชฃ เช•เชฐเซเชฏเชพ เชชเช›เซ€ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชฐเซ€เชกเชพเชฏเชฐเซ‡เช•เซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡
    • เชœเซ‡ เชฐเซ€เชคเซ‡ เช†เชชเชฃเซ‡ เชŸเซ‹เช•เชจ เช…เชชเชกเซ‡เชŸ เช•เชฐเซ€เชถเซเช‚
    • เชธเซเชฐเช•เซเชทเชพ เช•เซ‹เชก
    • เชšเช•เชพเชธเชฃเซ€ เช•เซ‹เชก เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชซเซ‹เชฐเซเชฎเซ‡เชŸ

  2. เช…เชงเชฟเช•เซƒเชคเชคเชพ เชชเซ‚เชฐเซเชฃ เชฅเชฏเชพ เชชเช›เซ€, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ GET เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชฆเซเชตเชพเชฐเชพ เชชเชธเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเซ€ เชญเซ‚เชฒ เช…เชฅเชตเชพ เช…เชงเชฟเช•เซƒเชคเชคเชพ เช•เซ‹เชก เชธเชพเชฅเซ‡, เชชเซเชฐเชฅเชฎ เชตเชฟเชจเช‚เชคเซ€เชฎเชพเช‚ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชชเซƒเชทเซเช  เชชเชฐ เชฐเซ€เชกเชพเชฏเชฐเซ‡เช•เซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.
  3. เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ (เชธเซเช•เซเชฐเซ€เชชเซเชŸ) เชจเซ‡ เช† เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡ เช…เชจเซ‡, เชœเซ‹ เช•เซ‹เชก เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซ‹ เชนเซ‹เชฏ, เชคเซ‹ เชŸเซ‹เช•เชจเซเชธ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเซ‹
  4. เชœเซ‹ เชตเชฟเชจเช‚เชคเซ€ เชธเชพเชšเซ€ เชนเซ‹เชฏ, เชคเซ‹ Google API เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡:
    • เชเช•เซเชธเซ‡เชธ เชŸเซ‹เช•เชจ เชœเซ‡เชจเซ€ เชฎเชฆเชฆเชฅเซ€ เช…เชฎเซ‡ เชตเชฟเชจเช‚เชคเซ€เช“ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช
    • เช† เชŸเซ‹เช•เชจเชจเซ€ เชฎเชพเชจเซเชฏเชคเชพ เช…เชตเชงเชฟ
    • เชเช•เซเชธเซ‡เชธ เชŸเซ‹เช•เชจ เชฐเชฟเชซเซเชฐเซ‡เชถ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชŸเซ‹เช•เชจ เชฐเชฟเชซเซเชฐเซ‡เชถ เช•เชฐเซ‹.

เชชเซเชฐเชฅเชฎ เชคเชฎเชพเชฐเซ‡ Google API เช•เชจเซเชธเซ‹เชฒ เชชเชฐ เชœเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡: เช“เชณเช–เชชเชคเซเชฐ - Google API เช•เชจเซเชธเซ‹เชฒ, เช‡เชšเซเช›เชฟเชค เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชชเชธเช‚เชฆ เช•เชฐเซ‹ เช…เชจเซ‡ เช“เชณเช–เชชเชคเซเชฐ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เช•เซเชฒเชพเชฏเช‚เชŸ OAuth เช“เชณเช–เช•เชฐเซเชคเชพ เชฌเชจเชพเชตเซ‹. เชคเซเชฏเชพเช‚ (เช…เชฅเชตเชพ เชชเช›เซ€เชฅเซ€, เชฌเชจเชพเชตเซ‡เชฒ เช“เชณเช–เช•เชฐเซเชคเชพเชจเชพ เช—เซเชฃเชงเชฐเซเชฎเซ‹เชฎเชพเช‚) เชคเชฎเชพเชฐเซ‡ เชคเซ‡ เชธเชฐเชจเชพเชฎเชพเช‚เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช•เซ‡ เชœเซ‡เชจเชพ เชชเชฐ เชฐเซ€เชกเชพเชฏเชฐเซ‡เช•เซเชถเชจเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช›เซ‡. เช…เชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช† เชตเชฟเชตเชฟเชง เชฌเช‚เชฆเชฐเซ‹ เชธเชพเชฅเซ‡ เช˜เชฃเซ€ เชฒเซ‹เช•เชฒเชนเซ‹เชธเซเชŸ เชเชจเซเชŸเซเชฐเซ€เช“ เชนเชถเซ‡ (เชจเซ€เชšเซ‡ เชœเซเช“).

เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชเชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เชตเชพเช‚เชšเชตเชพ เชฎเชพเชŸเซ‡ เชคเซ‡เชจเซ‡ เชตเชงเซ เช…เชจเซเช•เซ‚เชณ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเซ‡ เชเช• เช…เชฒเช— เชซเช‚เช•เซเชถเชจเชฎเชพเช‚ เชชเซเชฐเชฅเชฎ เชชเช—เชฒเชพเช‚ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เชœเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชเช•เซเชธเซ‡เชธ เช…เชจเซ‡ เชฐเชฟเชซเซเชฐเซ‡เชถ เชŸเซ‹เช•เชจเซเชธ เชชเชฐเชค เช•เชฐเชถเซ‡:

$client_secret = 'Our Client Secret'
$client_id = 'Our Client ID'
function Get-GoogleAuthToken {
  if (-not [System.Net.HttpListener]::IsSupported) {
    "HttpListener is not supported."
    exit 1
  }
  $codeverifier = -join ((65..90) + (97..122) + (48..57) + 45 + 46 + 95 + 126 |Get-Random -Count 60| % {[char]$_})
  $hasher = new-object System.Security.Cryptography.SHA256Managed
  $hashByteArray = $hasher.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($codeverifier))
  $base64 = ((([System.Convert]::ToBase64String($hashByteArray)).replace('=','')).replace('+','-')).replace('/','_')
  $ports = @(10600,15084,39700,42847,65387,32079)
  $port = $ports[(get-random -Minimum 0 -maximum 5)]
  Write-Host "Start browser..."
  Start-Process "https://accounts.google.com/o/oauth2/v2/auth?code_challenge_method=S256&code_challenge=$base64&access_type=offline&client_id=$client_id&redirect_uri=http://localhost:$port&response_type=code&scope=https://www.googleapis.com/auth/admin.directory.user https://www.googleapis.com/auth/admin.directory.group"
  $listener = New-Object System.Net.HttpListener
  $listener.Prefixes.Add("http://localhost:"+$port+'/')
  try {$listener.Start()} catch {
    "Unable to start listener."
    exit 1
  }
  while (($code -eq $null)) {
    $context = $listener.GetContext()
    Write-Host "Connection accepted" -f 'mag'
    $url = $context.Request.RawUrl
    $code = $url.split('?')[1].split('=')[1].split('&')[0]
    if ($url.split('?')[1].split('=')[0] -eq 'error') {
      Write-Host "Error!"$code -f 'red'
      $buffer = [System.Text.Encoding]::UTF8.GetBytes("Error!"+$code)
      $context.Response.ContentLength64 = $buffer.Length
      $context.Response.OutputStream.Write($buffer, 0, $buffer.Length)
      $context.Response.OutputStream.Close()
      $listener.Stop()
      exit 1
    }
    $buffer = [System.Text.Encoding]::UTF8.GetBytes("Now you can close this browser tab.")
    $context.Response.ContentLength64 = $buffer.Length
    $context.Response.OutputStream.Write($buffer, 0, $buffer.Length)
    $context.Response.OutputStream.Close()
    $listener.Stop()
  }
  Return Invoke-RestMethod -Method Post -Uri "https://www.googleapis.com/oauth2/v4/token" -Body @{
    code = $code
    client_id = $client_id
    client_secret = $client_secret
    redirect_uri = 'http://localhost:'+$port
    grant_type = 'authorization_code'
    code_verifier   = $codeverifier
  }
  $code = $null

เช…เชฎเซ‡ OAuth เช•เซเชฒเชพเชฏเช‚เชŸ เช†เช‡เชกเซ‡เชจเซเชŸเชฟเชซเชพเชฏเชฐ เชชเซเชฐเซ‹เชชเชฐเซเชŸเซ€เชเชฎเชพเช‚ เชฎเซ‡เชณเชตเซ‡เชฒ เช•เซเชฒเชพเชˆเชจเซเชŸ เช†เชˆเชกเซ€ เช…เชจเซ‡ เช•เซเชฒเชพเชˆเชจเซเชŸ เชธเชฟเช•เซเชฐเซ‡เชŸ เชธเซ‡เชŸ เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ เช•เซ‹เชก เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ เช 43 เชฅเซ€ 128 เช…เช•เซเชทเชฐเซ‹เชจเซ€ เชธเซเชŸเซเชฐเชฟเช‚เช— เช›เซ‡ เชœเซ‡ เช…เชจเชฐเชฟเชเชฐเซเชตเซเชก เช…เช•เซเชทเชฐเซ‹เชฎเชพเช‚เชฅเซ€ เชฐเซ‡เชจเซเชกเชฎเชฒเซ€ เชœเชจเชฐเซ‡เชŸ เชฅเชตเซ€ เชœเซ‹เชˆเช: [AZ] / [az] / [0-9 ] / "-" / "." / "_" / "~".

เช† เช•เซ‹เชก เชชเช›เซ€ เชซเชฐเซ€เชฅเซ€ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เชคเซ‡ เชจเชฌเชณเชพเชˆเชจเซ‡ เชฆเซ‚เชฐ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชนเซเชฎเชฒเชพเช–เซ‹เชฐ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ€ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชชเช›เซ€ เชฐเซ€เชกเชพเชฏเชฐเซ‡เช•เซเชŸ เชคเชฐเซ€เช•เซ‡ เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒ เชชเซเชฐเชคเชฟเชธเชพเชฆเชจเซ‡ เช…เชŸเช•เชพเชตเซ€ เชถเช•เซ‡ เช›เซ‡.
เชคเชฎเซ‡ เชธเซเชชเชทเซเชŸ เชŸเซ‡เช•เซเชธเซเชŸเชฎเชพเช‚ เชตเชฐเซเชคเชฎเชพเชจ เชตเชฟเชจเช‚เชคเซ€เชฎเชพเช‚ เช•เซ‹เชก เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ เชฎเซ‹เช•เชฒเซ€ เชถเช•เซ‹ เช›เซ‹ (เชœเซ‡ เชคเซ‡เชจเซ‡ เช…เชฐเซเชฅเชนเซ€เชจ เชฌเชจเชพเชตเซ‡ เช›เซ‡ - เช† เชซเช•เซเชค เชคเซ‡ เชธเชฟเชธเซเชŸเชฎเซเชธ เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ เช›เซ‡ เชœเซ‡ SHA256 เชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเชคเซ€ เชจเชฅเซ€), เช…เชฅเชตเชพ SHA256 เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชนเซ‡เชถ เชฌเชจเชพเชตเซ€เชจเซ‡, เชœเซ‡ BASE64Url เชฎเชพเช‚ เชเชจเซเช•เซ‹เชก เชฅเชฏเซ‡เชฒ เชนเซ‹เชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡ (เช…เชฒเช— เชฌเซ‡เช 64 เชฅเซ€ เชฌเซ‡ เชŸเซ‡เชฌเชฒ เช…เช•เซเชทเชฐเซ‹ เชฆเซเชตเชพเชฐเชพ) เช…เชจเซ‡ เช…เช•เซเชทเชฐ เชฐเซ‡เช–เชพเชจเชพ เช…เช‚เชคเชจเซ‡ เชฆเซ‚เชฐ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช: =.

เช†เช—เชณ, เช…เชงเชฟเช•เซƒเชคเชคเชพ เชชเช›เซ€ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเชพเชฐเซ‡ เชธเซเชฅเชพเชจเชฟเช• เชฎเชถเซ€เชจ เชชเชฐ HTTP เชธเชพเช‚เชญเชณเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชœเซ‡ เชฐเซ€เชกเชพเชฏเชฐเซ‡เช•เซเชŸ เชคเชฐเซ€เช•เซ‡ เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เชตเชนเซ€เชตเชŸเซ€ เช•เชพเชฐเซเชฏเซ‹ เช–เชพเชธ เชธเชฐเซเชตเชฐ เชชเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชฎเซ‡ เชเชตเซ€ เชถเช•เซเชฏเชคเชพเชจเซ‡ เชจเช•เชพเชฐเซ€ เชถเช•เชคเชพ เชจเชฅเซ€ เช•เซ‡ เชเช• เชœ เชธเชฎเชฏเซ‡ เช˜เชฃเชพ เชธเช‚เชšเชพเชฒเช•เซ‹ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชšเชฒเชพเชตเชถเซ‡, เชคเซ‡เชฅเซ€ เชคเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฎเชพเชŸเซ‡ เชฐเซ‡เชจเซเชกเชฎเชฒเซ€ เชชเซ‹เชฐเซเชŸ เชชเชธเช‚เชฆ เช•เชฐเชถเซ‡, เชชเชฐเช‚เชคเซ เชฎเซ‡เช‚ เชชเซ‚เชฐเซเชตเชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชฌเช‚เชฆเชฐเซ‹เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซเชฏเซ‹ เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡เช“ API เช•เชจเซเชธเซ‹เชฒเชฎเชพเช‚ เชตเชฟเชถเซเชตเชพเชธเชชเชพเชคเซเชฐ เชคเชฐเซ€เช•เซ‡ เชชเชฃ เช‰เชฎเซ‡เชฐเชพเชคเชพ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช.

เชเช•เซเชธเซ‡เชธ_เชŸเชพเช‡เชช=เช“เชซเชฒเชพเช‡เชจ เชคเซ‡เชจเซ‹ เช…เชฐเซเชฅ เช เช›เซ‡ เช•เซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฌเซเชฐเชพเช‰เชเชฐ เชธเชพเชฅเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ€ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชตเชฟเชจเชพ เชคเซ‡เชจเชพ เชชเซ‹เชคเชพเชจเชพ เชชเชฐ เชธเชฎเชพเชชเซเชค เชฅเชฏเซ‡เชฒ เชŸเซ‹เช•เชจ เช…เชชเชกเซ‡เชŸ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡,
เชชเซเชฐเชคเชฟเชญเชพเชต_เชชเซเชฐเช•เชพเชฐ=เช•เซ‹เชก เช•เซ‹เชก เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชคเซ‡เชจเซเช‚ เชซเซ‹เชฐเซเชฎเซ‡เชŸ เชธเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡ (เชœเซ‚เชจเซ€ เช…เชงเชฟเช•เซƒเชคเชคเชพ เชชเชฆเซเชงเชคเชฟเชจเซ‹ เชธเช‚เชฆเชฐเซเชญ, เชœเซเชฏเชพเชฐเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช เชฌเซเชฐเชพเช‰เชเชฐเชฎเชพเช‚เชฅเซ€ เช•เซ‹เชกเชจเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชฎเชพเช‚ เช•เซ‰เชชเชฟ เช•เชฐเซเชฏเซ‹ เชนเชคเซ‹),
เช…เชตเช•เชพเชถ เช…เชตเช•เชพเชถ เช…เชจเซ‡ เชเช•เซเชธเซ‡เชธเชจเซ‹ เชชเซเชฐเช•เชพเชฐ เชธเซ‚เชšเชตเซ‡ เช›เซ‡. เชคเซ‡เช“ เช–เชพเชฒเซ€ เชœเช—เซเชฏเชพเช“ เช…เชฅเชตเชพ %20 (URL เชเชจเซเช•เซ‹เชกเชฟเช‚เช— เช…เชจเซเชธเชพเชฐ) เชฆเซเชตเชพเชฐเชพ เช…เชฒเช— เชนเซ‹เชตเชพ เชœเซ‹เชˆเช. เชชเซเชฐเช•เชพเชฐเซ‹ เชธเชพเชฅเซ‡ เชเช•เซเชธเซ‡เชธ เชตเชฟเชธเซเชคเชพเชฐเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เช…เชนเซ€เช‚ เชœเซ‹เชˆ เชถเช•เชพเชฏ เช›เซ‡: Google API เชฎเชพเชŸเซ‡ OAuth 2.0 เชธเซเช•เซ‹เชชเซเชธ.

เช…เชงเชฟเช•เซƒเชคเชคเชพ เช•เซ‹เชก เชชเซเชฐเชพเชชเซเชค เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฌเซเชฐเชพเช‰เชเชฐเชจเซ‡ เชจเชœเซ€เช•เชจเซ‹ เชธเช‚เชฆเซ‡เชถ เช†เชชเชถเซ‡, เชชเซ‹เชฐเซเชŸ เชชเชฐ เชธเชพเช‚เชญเชณเชตเชพเชจเซเช‚ เชฌเช‚เชง เช•เชฐเชถเซ‡ เช…เชจเซ‡ เชŸเซ‹เช•เชจ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡ POST เชตเชฟเชจเช‚เชคเซ€ เชฎเซ‹เช•เชฒเชถเซ‡. เช…เชฎเซ‡ เชคเซ‡เชฎเชพเช‚ เช…เช—เชพเช‰ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เช†เชˆเชกเซ€ เช…เชจเซ‡ เช•เชจเซเชธเซ‹เชฒ API เชฅเซ€ เช—เซเชชเซเชค, เชธเชฐเชจเชพเชฎเซเช‚ เช•เซ‡ เชœเซ‡เชจเชพ เชชเชฐ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชฐเซ€เชกเชพเชฏเชฐเซ‡เช•เซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เช…เชจเซ‡ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชธเซเชชเชทเซเชŸเซ€เช•เชฐเชฃ เช…เชจเซเชธเชพเชฐ grant_type เชธเซ‚เชšเชตเซ€เช เช›เซ€เช.

เชœเชตเชพเชฌเชฎเชพเช‚, เช…เชฎเชจเซ‡ เชเช•เซเชธเซ‡เชธ เชŸเซ‹เช•เชจ, เชธเซ‡เช•เชจเซเชกเชฎเชพเช‚ เชคเซ‡เชจเซ€ เชฎเชพเชจเซเชฏเชคเชพ เช…เชตเชงเชฟ เช…เชจเซ‡ เชฐเชฟเชซเซเชฐเซ‡เชถ เชŸเซ‹เช•เชจ เชชเซเชฐเชพเชชเซเชค เชฅเชถเซ‡, เชœเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เช…เชฎเซ‡ เชเช•เซเชธเซ‡เชธ เชŸเซ‹เช•เชจ เช…เชชเชกเซ‡เชŸ เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช.

เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‡ เชฒเชพเช‚เชฌเชพ เชถเซ‡เชฒเซเชซ เชฒเชพเช‡เชซ เชธเชพเชฅเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เชธเซเชฅเชพเชจเซ‡ เชŸเซ‹เช•เชจเซเชธ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชœเซ‹เชˆเช, เชคเซ‡เชฅเซ€ เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เช…เชฎเซ‡ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซ‡เชฒ เชเช•เซเชธเซ‡เชธเชจเซ‡ เชฐเชฆ เชจ เช•เชฐเซ€เช เชคเซเชฏเชพเช‚ เชธเซเชงเซ€, เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฐเซ€เชซเซเชฐเซ‡เชถ เชŸเซ‹เช•เชจ เชชเชฐเชค เช•เชฐเชถเซ‡ เชจเชนเซ€เช‚. เช…เช‚เชคเซ‡, เชฎเซ‡เช‚ เชŸเซ‹เช•เชจ เชฐเชฆ เช•เชฐเชตเชพเชจเซ€ เชตเชฟเชจเช‚เชคเซ€ เช‰เชฎเซ‡เชฐเซ€; เชœเซ‹ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชธเชซเชณเชคเชพเชชเซ‚เชฐเซเชตเช• เชชเซ‚เชฐเซเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชจ เชนเชคเซ€ เช…เชจเซ‡ เชฐเชฟเชซเซเชฐเซ‡เชถ เชŸเซ‹เช•เชจ เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชจ เชนเชคเซเช‚, เชคเซ‹ เชคเซ‡ เชซเชฐเซ€เชฅเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชถเชฐเซ‚ เช•เชฐเชถเซ‡ (เช…เชฎเซ‡ เชŸเชฐเซเชฎเชฟเชจเชฒ เชชเชฐ เชธเซเชฅเชพเชจเชฟเช• เชฐเซ€เชคเซ‡ เชŸเซ‹เช•เชจ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพเชจเซเช‚ เช…เชธเซเชฐเช•เซเชทเชฟเชค เชฎเชพเชจเซเชฏเซเช‚ เช›เซ‡, เช…เชจเซ‡ เช…เชฎเซ‡ เชกเซ‹เชจ เช•เซเชฐเชฟเชชเซเชŸเซ‹เช—เซเชฐเชพเชซเซ€ เชธเชพเชฅเซ‡ เชตเชธเซเชคเซเช“เชจเซ‡ เชœเชŸเชฟเชฒ เชฌเชจเชพเชตเชตเชพ เช…เชฅเชตเชพ เชฌเซเชฐเชพเช‰เชเชฐเชจเซ‡ เชตเชพเชฐเช‚เชตเชพเชฐ เช–เซ‹เชฒเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชจเชฅเซ€).

do {
  $token_result = Get-GoogleAuthToken
  $token = $token_result.access_token
  if ($token_result.refresh_token -eq $null) {
    Write-Host ("Session is not destroyed. Revoking token...")
    Invoke-WebRequest -Uri ("https://accounts.google.com/o/oauth2/revoke?token="+$token)
  }
} while ($token_result.refresh_token -eq $null)
$refresh_token = $token_result.refresh_token
$minute = ([int]("{0:mm}" -f ([timespan]::fromseconds($token_result.expires_in))))+((Get-date).Minute)-2
if ($minute -lt 0) {$minute += 60}
elseif ($minute -gt 59) {$minute -=60}
$token_expire = @{
  hour = ([int]("{0:hh}" -f ([timespan]::fromseconds($token_result.expires_in))))+((Get-date).Hour)
  minute = $minute
}

เชคเชฎเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชจเซ‹เช‚เชงเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡, เชŸเซ‹เช•เชจ เชฐเชฆ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, Invoke-WebRequest เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฅเชพเชฏ เช›เซ‡. Invoke-RestMethodเชฅเซ€ เชตเชฟเชชเชฐเซ€เชค, เชคเซ‡ เชชเซเชฐเชพเชชเซเชค เชกเซ‡เชŸเชพเชจเซ‡ เช‰เชชเชฏเซ‹เช—เซ€ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เชชเชฐเชค เช•เชฐเชคเซเช‚ เชจเชฅเซ€ เช…เชจเซ‡ เชตเชฟเชจเช‚เชคเซ€เชจเซ€ เชธเซเชฅเชฟเชคเชฟ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡.

เช†เช—เชณ, เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชคเชฎเชจเซ‡ เชฒเซ‰เช—เชฟเชจ + เช‡เชฎเซ‡เช‡เชฒ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ€เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซเช‚ เชชเซเชฐเชฅเชฎ เช…เชจเซ‡ เช›เซ‡เชฒเซเชฒเซเช‚ เชจเชพเชฎ เชฆเชพเช–เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชนเซ‡ เช›เซ‡.

เชตเชฟเชจเช‚เชคเซ€เช“

เช†เช—เชณเชจเซ€ เชตเชฟเชจเช‚เชคเซ€เช“ เชนเชถเซ‡ - เชธเซŒ เชชเซเชฐเชฅเชฎ, เชคเชฎเชพเชฐเซ‡ เชจเชตเซเช‚ เชฌเชจเชพเชตเชตเชพ เช…เชฅเชตเชพ เชตเชฐเซเชคเชฎเชพเชจเชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเชตเชพ เช…เช‚เช—เซ‡ เชจเชฟเชฐเซเชฃเชฏ เชฒเซ‡เชตเชพ เชฎเชพเชŸเซ‡ เชธเชฎเชพเชจ เชฒเซ‹เช—เชฟเชจ เชธเชพเชฅเซ‡เชจเซ‹ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชคเชชเชพเชธเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชฎเซ‡เช‚ เชธเซเชตเซ€เชšเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชชเชธเช‚เชฆเช—เซ€ เชธเชพเชฅเซ‡ เชเช• เชซเช‚เช•เซเชถเชจเชจเชพ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เชฌเชงเซ€ เชตเชฟเชจเช‚เชคเซ€เช“เชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚:

function GoogleQuery {
  param (
    $type,
    $query
  )
  switch ($type) {
    "SearchAccount" {
      Return Invoke-RestMethod -Method Get -Uri "https://www.googleapis.com/admin/directory/v1/users" -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body @{
        domain = 'rocketguys.com'
        query  = "email:$query"
      }
    }
    "UpdateAccount" {
      $body = @{
        name  = @{
          givenName = $query['givenName']
          familyName = $query['familyName']
        }
        suspended = 'false'
        password = $query['password']
        changePasswordAtNextLogin = 'true'
        phones = @(@{
          primary = 'true'
          value = $query['phone']
          type = "mobile"
        })
        orgUnitPath = $query['orgunit']
      }
      Return Invoke-RestMethod -Method Put -Uri ("https://www.googleapis.com/admin/directory/v1/users/"+$query['email']) -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body (ConvertTo-Json $body) -ContentType 'application/json; charset=utf-8'
    }
    
    "CreateAccount" {
      $body = @{
        primaryEmail = $query['email']
        name  = @{
          givenName = $query['givenName']
          familyName = $query['familyName']
        }
        suspended = 'false'
        password = $query['password']
        changePasswordAtNextLogin = 'true'
        phones = @(@{
          primary = 'true'
          value = $query['phone']
          type = "mobile"
        })
        orgUnitPath = $query['orgunit']
      }
      Return Invoke-RestMethod -Method Post -Uri "https://www.googleapis.com/admin/directory/v1/users" -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body (ConvertTo-Json $body) -ContentType 'application/json; charset=utf-8'
    }
    "AddMember" {
      $body = @{
        userKey = $query['email']
      }
      $ifrequest = Invoke-RestMethod -Method Get -Uri "https://www.googleapis.com/admin/directory/v1/groups" -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body $body
      $array = @()
      foreach ($group in $ifrequest.groups) {$array += $group.email}
      if ($array -notcontains $query['groupkey']) {
        $body = @{
          email = $query['email']
          role = "MEMBER"
        }
        Return Invoke-RestMethod -Method Post -Uri ("https://www.googleapis.com/admin/directory/v1/groups/"+$query['groupkey']+"/members") -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body (ConvertTo-Json $body) -ContentType 'application/json; charset=utf-8'
      } else {
        Return ($query['email']+" now is a member of "+$query['groupkey'])
      }
    }
  }
}

เชฆเชฐเซ‡เช• เชตเชฟเชจเช‚เชคเชฟเชฎเชพเช‚, เชคเชฎเชพเชฐเซ‡ เชŸเซ‹เช•เชจ เชชเซเชฐเช•เชพเชฐ เช…เชจเซ‡ เชเช•เซเชธเซ‡เชธ เชŸเซ‹เช•เชจ เชธเชพเชฅเซ‡เชจเซเช‚ เช“เชฅเซ‹เชฐเชพเชˆเชเซ‡เชถเชจ เชนเซ‡เชกเชฐ เชฎเซ‹เช•เชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชนเชพเชฒเชฎเชพเช‚, เชŸเซ‹เช•เชจ เชชเซเชฐเช•เชพเชฐ เชนเช‚เชฎเซ‡เชถเชพ เชฌเซ‡เชฐเชฐ เช›เซ‡. เช•เชพเชฐเชฃ เช•เซ‡ เช…เชฎเชพเชฐเซ‡ เชคเชชเชพเชธ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช•เซ‡ เชŸเซ‹เช•เชจ เชธเชฎเชพเชชเซเชค เชฅเชˆ เช—เชฏเซเช‚ เชจเชฅเซ€ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชœเชพเชฐเซ€ เช•เชฐเซเชฏเชพเชจเชพ เชเช• เช•เชฒเชพเช• เชชเช›เซ€ เช…เชชเชกเซ‡เชŸ เช•เชฐเซ‹, เชฎเซ‡เช‚ เช…เชจเซเชฏ เช•เชพเชฐเซเชฏ เชฎเชพเชŸเซ‡ เชตเชฟเชจเช‚เชคเซ€เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเซเชฏเซ‹ เช›เซ‡ เชœเซ‡ เชเช•เซเชธเซ‡เชธ เชŸเซ‹เช•เชจ เชชเชฐเชค เช•เชฐเซ‡ เช›เซ‡. เชชเซเชฐเชฅเชฎ เชเช•เซเชธเซ‡เชธ เชŸเซ‹เช•เชจ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช•เซ‹เชกเชจเซ‹ เชธเชฎเชพเชจ เชญเชพเช— เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เชนเซ‹เชฏ เช›เซ‡:

function Get-GoogleToken {
  if (((Get-date).Hour -gt $token_expire.hour) -or (((Get-date).Hour -ge $token_expire.hour) -and ((Get-date).Minute -gt $token_expire.minute))) {
  Write-Host "Token Expired. Refreshing..."
    $request = (Invoke-RestMethod -Method Post -Uri "https://www.googleapis.com/oauth2/v4/token" -ContentType 'application/x-www-form-urlencoded' -Body @{
      client_id = $client_id
      client_secret = $client_secret
      refresh_token = $refresh_token
      grant_type = 'refresh_token'
    })
    $token = $request.access_token
    $minute = ([int]("{0:mm}" -f ([timespan]::fromseconds($request.expires_in))))+((Get-date).Minute)-2
    if ($minute -lt 0) {$minute += 60}
    elseif ($minute -gt 59) {$minute -=60}
    $script:token_expire = @{
      hour = ([int]("{0:hh}" -f ([timespan]::fromseconds($request.expires_in))))+((Get-date).Hour)
      minute = $minute
    }
  }
  return $token
}

เช…เชธเซเชคเชฟเชคเซเชต เชฎเชพเชŸเซ‡ เชฒเซ‰เช—เชฟเชจ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡:

function Check_Google {
  $query = (GoogleQuery 'SearchAccount' $username)
  if ($query.users -ne $null) {
    $user = $query.users[0]
    Write-Host $user.name.fullName' - '$user.PrimaryEmail' - suspended: '$user.Suspended
    $GAresult = $user
  }
  if ($GAresult) {
      $return = $GAresult
  } else {$return = 'gg'}
  return $return
}

เช‡เชฎเซ‡เช‡เชฒ:$เช•เซเชตเซ‡เชฐเซ€ เชตเชฟเชจเช‚เชคเซ€ เชเชชเซ€เช†เช‡เชจเซ‡ เช‰เชชเชจเชพเชฎเซ‹ เชธเชนเชฟเชค, เชฌเชฐเชพเชฌเชฐ เชคเซ‡ เชœ เช‡เชฎเซ‡เช‡เชฒ เชงเชฐเชพเชตเชคเชพ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชถเซ‹เชงเชตเชพเชจเซเช‚ เช•เชนเซ‡เชถเซ‡. เชคเชฎเซ‡ เชตเชพเช‡เชฒเซเชกเช•เชพเชฐเซเชกเชจเซ‹ เชชเชฃ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹: =, :, :{PREFIX}*.

เชกเซ‡เชŸเชพ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡, GET เชตเชฟเชจเช‚เชคเซ€ เชชเชฆเซเชงเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹, เชกเซ‡เชŸเชพ เชฆเชพเช–เชฒ เช•เชฐเชตเชพ (เชเช•เชพเช‰เชจเซเชŸ เชฌเชจเชพเชตเชตเซเช‚ เช…เชฅเชตเชพ เชœเซ‚เชฅเชฎเชพเช‚ เชธเชญเซเชฏ เช‰เชฎเซ‡เชฐเชตเซเช‚) - POST, เชตเชฐเซเชคเชฎเชพเชจ เชกเซ‡เชŸเชพ เช…เชชเชกเซ‡เชŸ เช•เชฐเชตเชพ - PUT, เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชพเชขเซ€ เชจเชพเช–เชตเชพ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชœเซ‚เชฅเชฎเชพเช‚เชฅเซ€ เชธเชญเซเชฏ) - เช•เชพเชขเซ€ เชจเชพเช–เซ‹.

เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชซเซ‹เชจ เชจเช‚เชฌเชฐ (เช…เชฎเชพเชจเซเชฏ เชธเซเชŸเซเชฐเชฟเช‚เช—) เช…เชจเซ‡ เชชเซเชฐเชพเชฆเซ‡เชถเชฟเช• เชตเชฟเชคเชฐเชฃ เชœเซ‚เชฅเชฎเชพเช‚ เชธเชฎเชพเชตเซ‡เชถ เชฎเชพเชŸเซ‡ เชชเชฃ เชชเซ‚เช›เชถเซ‡. เชคเซ‡ เชจเช•เซเช•เซ€ เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เชชเชธเช‚เชฆ เช•เชฐเซ‡เชฒ เชเช•เซเชŸเชฟเชต เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ OUเชจเชพ เช†เชงเชพเชฐเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช เช•เชฏเซเช‚ เชธเช‚เชธเซเชฅเชพเช•เซ€เชฏ เชเช•เชฎ เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช เช…เชจเซ‡ เชชเชพเชธเชตเชฐเซเชก เชธเชพเชฅเซ‡ เช†เชตเซ‡ เช›เซ‡:

do {
  $phone = Read-Host "ะขะตะปะตั„ะพะฝ ะฒ ั„ะพั€ะผะฐั‚ะต +7ั…ั…ั…ั…ั…ั…ั…ั…"
} while (-not $phone)
do {
    $moscow = Read-Host "ะ’ ะœะพัะบะพะฒัะบะธะน ะพั„ะธั? (y/n) "
} while (-not (($moscow -eq 'y') -or ($moscow -eq 'n')))
$orgunit = '/'
if ($OU -like "*OU=Delivery,OU=Users,OU=ROOT,DC=rocket,DC=local") {
    Write-host "ะ‘ัƒะดะตั‚ ัะพะทะดะฐะฝะฐ ะฒ /Team delivery"
    $orgunit = "/Team delivery"
}
$Password =  -join ( 48..57 + 65..90 + 97..122 | Get-Random -Count 12 | % {[char]$_})+"*Ba"

เช…เชจเซ‡ เชชเช›เซ€ เชคเซ‡ เช–เชพเชคเชพเชฎเชพเช‚ เชšเชพเชฒเชพเช•เซ€ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡:

$query = @{
  email = $email
  givenName = $firstname
  familyName = $lastname
  password = $password
  phone = $phone
  orgunit = $orgunit
}
if ($GMailExist) {
  Write-Host "ะ—ะฐะฟัƒัะบะฐะตะผ ะธะทะผะตะฝะตะฝะธะต ะฐะบะบะฐัƒะฝั‚ะฐ" -f mag
  (GoogleQuery 'UpdateAccount' $query) | fl
  write-host "ะะต ะทะฐะฑัƒะดัŒ ะฟั€ะพะฒะตั€ะธั‚ัŒ ะณั€ัƒะฟะฟั‹ ัƒ ะฒะบะปัŽั‡ะตะฝะฝะพะณะพ $Username ะฒ Google."
} else {
  Write-Host "ะ—ะฐะฟัƒัะบะฐะตะผ ัะพะทะดะฐะฝะธะต ะฐะบะบะฐัƒะฝั‚ะฐ" -f mag
  (GoogleQuery 'CreateAccount' $query) | fl
}
if ($moscow -eq "y"){
  write-host "ะ”ะพะฑะฐะฒะปัะตะผ ะฒ ะณั€ัƒะฟะฟัƒ moscowoffice"
  $query = @{
    groupkey = '[email protected]'
    email = $email
  }
  (GoogleQuery 'AddMember' $query) | fl
}

เชเช•เชพเช‰เชจเซเชŸ เช…เชชเชกเซ‡เชŸ เช•เชฐเชตเชพ เช…เชจเซ‡ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡เชจเชพเช‚ เช•เชพเชฐเซเชฏเซ‹เชฎเชพเช‚ เชธเชฎเชพเชจ เชตเชพเช•เซเชฏเชฐเชšเชจเชพ เชนเซ‹เชฏ เช›เซ‡; เชฌเชงเชพ เชตเชงเชพเชฐเชพเชจเชพ เชซเซ€เชฒเซเชก เชœเชฐเซ‚เชฐเซ€ เชจเชฅเซ€; เชซเซ‹เชจ เชจเช‚เชฌเชฐ เชธเชพเชฅเซ‡เชจเชพ เชตเชฟเชญเชพเช—เชฎเชพเช‚, เชคเชฎเชพเชฐเซ‡ เชเชฐเซ‡เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชจเช‚เชฌเชฐ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชชเซเชฐเช•เชพเชฐ เชธเชพเชฅเซ‡ เชเช• เชฐเซ‡เช•เซ‹เชฐเซเชก เชนเซ‹เชˆ เชถเช•เซ‡.

เช•เซ‹เชˆ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชœเซ‚เชฅเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเชคเซ€ เชตเช–เชคเซ‡ เช•เซ‹เชˆ เชญเซ‚เชฒ เชจ เช†เชตเซ‡ เชคเซ‡ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เชธเซŒเชชเซเชฐเชฅเชฎ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเชพเชธเซ‡เชฅเซ€ เชœเซ‚เชฅเชจเชพ เชธเชญเซเชฏเซ‹ เช…เชฅเชตเชพ เชฐเชšเชจเชพเชจเซ€ เชธเซ‚เชšเชฟ เชฎเซ‡เชณเชตเซ€เชจเซ‡ เชคเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช† เชœเซ‚เชฅเชจเชพ เชธเชญเซเชฏ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชคเชชเชพเชธเซ€ เชถเช•เซ€เช เช›เซ€เช.

เชšเซ‹เช•เซเช•เชธ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ€ เชœเซ‚เชฅ เชธเชญเซเชฏเชชเชฆเชจเซ€ เช•เซเชตเซ‡เชฐเซ€ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชฟเชค เชฐเชนเซ‡เชถเซ‡ เชจเชนเซ€เช‚ เช…เชจเซ‡ เชคเซ‡ เชซเช•เซเชค เชธเซ€เชงเซ€ เชธเชญเซเชฏเชชเชฆ เชฌเชคเชพเชตเชถเซ‡. เชชเซ‡เชฐเซ‡เชจเซเชŸ เช—เซเชฐเซ‚เชชเชฎเชพเช‚ เชเชตเชพ เชฏเซเชเชฐเชจเซ‡ เชธเชพเชฎเซ‡เชฒ เช•เชฐเชตเซเช‚ เช•เซ‡ เชœเซ‡เชจเซ€ เชชเชพเชธเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชเช• เชšเชพเชˆเชฒเซเชก เช—เซเชฐเซ‚เชช เช›เซ‡ เชœเซ‡เชจเซ‹ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชธเชญเซเชฏ เช›เซ‡.

เชจเชฟเชทเซเช•เชฐเซเชท

เชœเซ‡ เชฌเชพเช•เซ€ เช›เซ‡ เชคเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เชจเชตเชพ เชเช•เชพเช‰เชจเซเชŸ เชฎเชพเชŸเซ‡ เชชเชพเชธเชตเชฐเซเชก เชฎเซ‹เช•เชฒเชตเชพเชจเซเช‚ เช›เซ‡. เช…เชฎเซ‡ เช† เชเชธเชเชฎเชเชธ เชฆเซเชตเชพเชฐเชพ เช•เชฐเซ€เช เช›เซ€เช, เช…เชจเซ‡ เชธเซ‚เชšเชจเชพเช“ เชธเชพเชฅเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฎเชพเชนเชฟเชคเซ€ เชฎเซ‹เช•เชฒเซ€เช เช›เซ€เช เช…เชจเซ‡ เชตเซเชฏเช•เซเชคเชฟเช—เชค เช‡เชฎเซ‡เช‡เชฒ เชชเชฐ เชฒเซ‰เช—เชฟเชจ เช•เชฐเซ€เช เช›เซ€เช, เชœเซ‡, เชซเซ‹เชจ เชจเช‚เชฌเชฐ เชธเชพเชฅเซ‡, เชญเชฐเชคเซ€ เชตเชฟเชญเชพเช— เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚. เชเช• เชตเชฟเช•เชฒเซเชช เชคเชฐเซ€เช•เซ‡, เชคเชฎเซ‡ เชชเซˆเชธเชพ เชฌเชšเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชจเซ‡ เช—เซเชชเซเชค เชŸเซ‡เชฒเชฟเช—เซเชฐเชพเชฎ เชšเซ‡เชŸเชฎเชพเช‚ เชคเชฎเชพเชฐเซ‹ เชชเชพเชธเชตเชฐเซเชก เชฎเซ‹เช•เชฒเซ€ เชถเช•เซ‹ เช›เซ‹, เชœเซ‡เชจเซ‡ เชฌเซ€เชœเซเช‚ เชชเชฐเชฟเชฌเชณ เชชเชฃ เช—เชฃเซ€ เชถเช•เชพเชฏ (เชฎเซ‡เช•เชฌเซเช•เซเชธ เช…เชชเชตเชพเชฆ เชนเชถเซ‡).

เช…เช‚เชค เชธเซเชงเซ€ เชตเชพเช‚เชšเชตเชพ เชฌเชฆเชฒ เช†เชญเชพเชฐ. เชฒเซ‡เช–เซ‹ เชฒเช–เชตเชพเชจเซ€ เชถเซˆเชฒเซ€ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เชธเซ‚เชšเชจเซ‹ เชœเซ‹เชˆเชจเซ‡ เชฎเชจเซ‡ เช†เชจเช‚เชฆ เชฅเชถเซ‡ เช…เชจเซ‡ เชนเซเช‚ เชˆเชšเซเช›เซเช‚ เช›เซเช‚ เช•เซ‡ เชคเชฎเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฒเช–เชคเซ€ เชตเช–เชคเซ‡ เช“เช›เซ€ เชญเซ‚เชฒเซ‹ เชชเช•เชกเซ‹ =)

เชฒเชฟเช‚เช•เซเชธเชจเซ€ เชธเซ‚เชšเชฟ เชœเซ‡ เชตเชฟเชทเชฏเซ‹เชจเซ€ เชฐเซ€เชคเซ‡ เช‰เชชเชฏเซ‹เช—เซ€ เชนเซ‹เชˆ เชถเช•เซ‡ เช…เชฅเชตเชพ เชซเช•เซเชค เชชเซเชฐเชถเซเชจเซ‹เชจเชพ เชœเชตเชพเชฌ เช†เชชเซ‡ เช›เซ‡:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹