ื™ืฆื™ืจืช ืžืฉืชืžืฉื™ Google ืž-PowerShell ื‘ืืžืฆืขื•ืช API

ื”ื™ื™!

ืžืืžืจ ื–ื” ื™ืชืืจ ืืช ื”ื™ื™ืฉื•ื ืฉืœ ืื™ื ื˜ืจืืงืฆื™ื” ืฉืœ PowerShell ืขื Google API ื›ื“ื™ ืœืชืžืจืŸ ืžืฉืชืžืฉื™ G Suite.

ืื ื• ืžืฉืชืžืฉื™ื ื‘ืžืกืคืจ ืฉื™ืจื•ืชื™ ืคื ื™ื ื•ืขื ืŸ ื‘ืจื—ื‘ื™ ื”ืืจื’ื•ืŸ. ืœืจื•ื‘, ื”ื”ืจืฉืื” ื‘ื”ื ืžืกืชื›ืžืช ื‘ื’ื•ื’ืœ ืื• ื‘-Active Directory, ืฉื‘ื™ื ื™ื”ื ืœื ื ื•ื›ืœ ืœืฉืžื•ืจ ืขื•ืชืง; ื‘ื”ืชืื, ื›ืืฉืจ ืขื•ื‘ื“ ื—ื“ืฉ ืขื•ื–ื‘, ืขืœื™ืš ืœื™ืฆื•ืจ/ืœืืคืฉืจ ื—ืฉื‘ื•ืŸ ื‘ืฉืชื™ ื”ืžืขืจื›ื•ืช ื”ืœืœื•. ื›ื“ื™ ืœื”ืคื•ืš ืืช ื”ืชื”ืœื™ืš ืœืื•ื˜ื•ืžื˜ื™, ื”ื—ืœื˜ื ื• ืœื›ืชื•ื‘ ืกืงืจื™ืคื˜ ืฉืื•ืกืฃ ืžื™ื“ืข ื•ืฉื•ืœื— ืื•ืชื• ืœืฉื ื™ ื”ืฉื™ืจื•ืชื™ื.

ื”ืจืฉืื”

ื‘ืขืช ืขืจื™ื›ืช ื”ื“ืจื™ืฉื•ืช, ื”ื—ืœื˜ื ื• ืœื”ืฉืชืžืฉ ื‘ืžื ื”ืœื™ื ืื ื•ืฉื™ื™ื ืืžื™ืชื™ื™ื ืœืฆื•ืจืš ื”ืจืฉืื”; ื”ื“ื‘ืจ ืžืคืฉื˜ ืืช ื ื™ืชื•ื— ื”ืคืขื•ืœื•ืช ื‘ืžืงืจื” ืฉืœ ืฉื™ื ื•ื™ื™ื ืžืกื™ื‘ื™ื™ื ืžืงืจื™ื™ื ืื• ืžื›ื•ื•ื ื™ื.

ืžืžืฉืงื™ API ืฉืœ Google ืžืฉืชืžืฉื™ื ื‘ืคืจื•ื˜ื•ืงื•ืœ OAuth 2.0 ืœืฆื•ืจืš ืื™ืžื•ืช ื•ื”ืจืฉืื”. ืžืงืจื™ ืฉื™ืžื•ืฉ ื•ืชื™ืื•ืจื™ื ืžืคื•ืจื˜ื™ื ื™ื•ืชืจ ื ื™ืชืŸ ืœืžืฆื•ื ื›ืืŸ: ืฉื™ืžื•ืฉ ื‘- OAuth 2.0 ืœื’ื™ืฉื” ืœืžืžืฉืงื™ API ืฉืœ Google.

ื‘ื—ืจืชื™ ื‘ืกืงืจื™ืคื˜ ื”ืžืฉืžืฉ ืœื”ืจืฉืื” ื‘ื™ื™ืฉื•ืžื™ ืฉื•ืœื—ืŸ ืขื‘ื•ื“ื”. ื™ืฉื ื” ื’ื ืืคืฉืจื•ืช ืœื”ืฉืชืžืฉ ื‘ื—ืฉื‘ื•ืŸ ืฉื™ืจื•ืช, ืฉืื™ื ื• ื“ื•ืจืฉ ืžื”ืžืฉืชืžืฉ ืชื ื•ืขื•ืช ืžื™ื•ืชืจื•ืช.

ื”ืชืžื•ื ื” ืœืžื˜ื” ื”ื™ื ืชื™ืื•ืจ ืกื›ืžื˜ื™ ืฉืœ ื”ืชืจื—ื™ืฉ ืฉื ื‘ื—ืจ ืžื“ืฃ Google.

ื™ืฆื™ืจืช ืžืฉืชืžืฉื™ Google ืž-PowerShell ื‘ืืžืฆืขื•ืช API

  1. ืจืืฉื™ืช, ืื ื• ืฉื•ืœื—ื™ื ืืช ื”ืžืฉืชืžืฉ ืœื“ืฃ ื”ืื™ืžื•ืช ืฉืœ ื—ืฉื‘ื•ืŸ Google, ืชื•ืš ืฆื™ื•ืŸ ืคืจืžื˜ืจื™ GET:
    • ืžื–ื”ื” ืืคืœื™ืงืฆื™ื”
    • ืื–ื•ืจื™ื ืฉื”ืืคืœื™ืงืฆื™ื” ืฆืจื™ื›ื” ื’ื™ืฉื” ืืœื™ื”ื
    • ื”ื›ืชื•ื‘ืช ืฉืืœื™ื” ื™ื•ืคื ื” ื”ืžืฉืชืžืฉ ืœืื—ืจ ื”ืฉืœืžืช ื”ื”ืœื™ืš
    • ื”ื“ืจืš ืฉื‘ื” ื ืขื“ื›ืŸ ืืช ื”ืืกื™ืžื•ืŸ
    • ืงื•ื“ ืื‘ื˜ื—ื”
    • ืคื•ืจืžื˜ ืฉื™ื“ื•ืจ ืงื•ื“ ืื™ืžื•ืช

  2. ืœืื—ืจ ื”ืฉืœืžืช ื”ื”ืจืฉืื”, ื”ืžืฉืชืžืฉ ื™ื•ืคื ื” ืœื“ืฃ ืฉืฆื•ื™ืŸ ื‘ื‘ืงืฉื” ื”ืจืืฉื•ื ื”, ืขื ืฉื’ื™ืื” ืื• ืงื•ื“ ื”ืจืฉืื” ืฉื™ื•ืขื‘ืจ ืขืœ ื™ื“ื™ ืคืจืžื˜ืจื™ GET
  3. ื”ืืคืœื™ืงืฆื™ื” (ืกืงืจื™ืคื˜) ืชืฆื˜ืจืš ืœืงื‘ืœ ืืช ื”ืคืจืžื˜ืจื™ื ื”ืœืœื•, ื•ืื ื™ืงื‘ืœ ืืช ื”ืงื•ื“, ืชื‘ืงืฉ ืืช ื”ื‘ืงืฉื” ื”ื‘ืื” ืœืงื‘ืœืช ืืกื™ืžื•ื ื™ื
  4. ืื ื”ื‘ืงืฉื” ื ื›ื•ื ื”, ื”-API ืฉืœ Google ืžื—ื–ื™ืจ:
    • ืืกื™ืžื•ืŸ ื’ื™ืฉื” ืฉื‘ืืžืฆืขื•ืชื• ื ื•ื›ืœ ืœื”ื’ื™ืฉ ื‘ืงืฉื•ืช
    • ืชืงื•ืคืช ื”ืชื•ืงืฃ ืฉืœ ืืกื™ืžื•ืŸ ื–ื”
    • ื ื“ืจืฉ ืจืขื ื•ืŸ ืืกื™ืžื•ืŸ ื›ื“ื™ ืœืจืขื ืŸ ืืช ืืกื™ืžื•ืŸ ื”ื’ื™ืฉื”.

ืจืืฉื™ืช ืขืœื™ืš ืœืขื‘ื•ืจ ืœืžืกื•ืฃ Google API: ืื™ืฉื•ืจื™ื - Google API Console, ื‘ื—ืจ ืืช ื”ื™ื™ืฉื•ื ื”ืจืฆื•ื™ ื•ื‘ืงื˜ืข ืื™ืฉื•ืจื™ื ืฆื•ืจ ืžื–ื”ื” OAuth ืœืงื•ื—. ืฉื (ืื• ืžืื•ื—ืจ ื™ื•ืชืจ, ื‘ืžืืคื™ื™ื ื™ ื”ืžื–ื”ื” ืฉื ื•ืฆืจ) ืขืœื™ืš ืœืฆื™ื™ืŸ ืืช ื”ื›ืชื•ื‘ื•ืช ืฉืืœื™ื”ืŸ ืžื•ืชืจ ืœื”ืคื ื•ืช ืžื—ื“ืฉ. ื‘ืžืงืจื” ืฉืœื ื•, ืืœื• ื™ื”ื™ื• ืžืกืคืจ ื›ื ื™ืกื•ืช ืฉืœ localhost ืขื ื™ืฆื™ืื•ืช ืฉื•ื ื•ืช (ืจืื” ืœื”ืœืŸ).

ื›ื“ื™ ืฉื™ื”ื™ื” ื ื•ื— ื™ื•ืชืจ ืœืงืจื•ื ืืช ืืœื’ื•ืจื™ืชื ื”ืกืงืจื™ืคื˜, ื ื™ืชืŸ ืœื”ืฆื™ื’ ืืช ื”ืฉืœื‘ื™ื ื”ืจืืฉื•ื ื™ื ื‘ืคื•ื ืงืฆื™ื” ื ืคืจื“ืช ืฉืชื—ื–ื™ืจ ืืช Access ื•ืชืจืขื ืŸ ืืกื™ืžื•ื ื™ื ืขื‘ื•ืจ ื”ืืคืœื™ืงืฆื™ื”:

$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), ืื• ืขืœ ื™ื“ื™ ื™ืฆื™ืจืช hash ื‘ืืžืฆืขื•ืช ืืœื’ื•ืจื™ืชื SHA256, ืื•ืชื• ื™ืฉ ืœืงื•ื“ื“ ื‘-BASE64Url (ืฉื•ื ื” ืž-Base64 ืขืœ ื™ื“ื™ ืฉื ื™ ืชื•ื•ื™ ื˜ื‘ืœื”) ื•ื”ืกืจืช ืกื™ื•ืžื•ืช ืฉื•ืจืช ื”ืชื•ื•ื™ื: =.

ืœืื—ืจ ืžื›ืŸ, ืขืœื™ื ื• ืœื”ืชื—ื™ืœ ืœื”ืื–ื™ืŸ ืœ-http ื‘ืžื—ืฉื‘ ื”ืžืงื•ืžื™ ืขืœ ืžื ืช ืœืงื‘ืœ ืชื’ื•ื‘ื” ืœืื—ืจ ื”ืจืฉืื”, ืฉืชื•ื—ื–ืจ ื›ื”ืคื ื™ื” ืžื—ื“ืฉ.

ืžืฉื™ืžื•ืช ื ื™ื”ื•ืœ ืžื‘ื•ืฆืขื•ืช ืขืœ ืฉืจืช ืžื™ื•ื—ื“, ืœื ื ื•ื›ืœ ืœืฉืœื•ืœ ืืช ื”ืืคืฉืจื•ืช ืฉืžืกืคืจ ืžื ื”ืœื™ ืžืขืจื›ืช ื™ืคืขื™ืœื• ืืช ื”ืกืงืจื™ืคื˜ ื‘ื• ื–ืžื ื™ืช, ืื– ื–ื” ื™ื‘ื—ืจ ืืงืจืื™ืช ืคื•ืจื˜ ืœืžืฉืชืžืฉ ื”ื ื•ื›ื—ื™, ืื‘ืœ ืฆื™ื™ื ืชื™ ืคื•ืจื˜ื™ื ืžื•ื’ื“ืจื™ื ืžืจืืฉ ื‘ื’ืœืœ ื™ืฉ ืœื”ื•ืกื™ืฃ ืื•ืชื ื’ื ื›ืืžื™ืŸ ื‘ืžืกื•ืฃ ื”-API.

access_type=ืœื ืžืงื•ื•ืŸ ืคื™ืจื•ืฉื• ืฉื”ืืคืœื™ืงืฆื™ื” ื™ื›ื•ืœื” ืœืขื“ื›ืŸ ืืกื™ืžื•ืŸ ืฉืคื’ ืชื•ืงืคื• ื‘ืขืฆืžื• ืœืœื ืื™ื ื˜ืจืืงืฆื™ื” ืฉืœ ื”ืžืฉืชืžืฉ ืขื ื”ื“ืคื“ืคืŸ,
response_type=ืงื•ื“ ืžื’ื“ื™ืจ ืืช ื”ืคื•ืจืžื˜ ืฉืœ ื”ืื•ืคืŸ ืฉื‘ื• ื”ืงื•ื“ ื™ื•ื—ื–ืจ (ื”ืคื ื™ื” ืœืฉื™ื˜ืช ื”ื”ืจืฉืื” ื”ื™ืฉื ื”, โ€‹โ€‹ื›ืืฉืจ ื”ืžืฉืชืžืฉ ื”ืขืชื™ืง ืืช ื”ืงื•ื“ ืžื”ื“ืคื“ืคืŸ ืœืกืงืจื™ืคื˜),
ื”ื™ืงืฃ ืžืฆื™ื™ืŸ ืืช ื”ื™ืงืฃ ื•ืกื•ื’ ื”ื’ื™ืฉื”. ื™ืฉ ืœื”ืคืจื™ื“ ื‘ื™ื ื™ื”ื ื‘ืจื•ื•ื—ื™ื ืื• %20 (ืขืœ ืคื™ ืงื™ื“ื•ื“ ื›ืชื•ื‘ืช ื”ืืชืจ). ืจืฉื™ืžื” ืฉืœ ืื–ื•ืจื™ ื’ื™ืฉื” ืขื ืกื•ื’ื™ื ื ื™ืชืŸ ืœืจืื•ืช ื›ืืŸ: ื”ื™ืงืคื™ OAuth 2.0 ืขื‘ื•ืจ ืžืžืฉืงื™ API ืฉืœ Google.

ืœืื—ืจ ืงื‘ืœืช ืงื•ื“ ื”ื”ืจืฉืื”, ื”ืืคืœื™ืงืฆื™ื” ืชื—ื–ื™ืจ ื”ื•ื“ืขื” ืกื’ื•ืจื” ืœื“ืคื“ืคืŸ, ืชืคืกื™ืง ืœื”ืื–ื™ืŸ ื‘ืคื•ืจื˜ ื•ืชืฉืœื— ื‘ืงืฉืช POST ืœืงื‘ืœืช ื”ืืกื™ืžื•ืŸ. ืื ื• ืžืฆื™ื™ื ื™ื ื‘ื• ืืช ื”ืžื–ื”ื” ื•ื”ืกื•ื“ ืฉืฆื•ื™ื ื• ืงื•ื“ื ืœื›ืŸ ืž-API ืฉืœ ื”ืžืกื•ืฃ, ื”ื›ืชื•ื‘ืช ืืœื™ื” ื™ื•ืคื ื” ื”ืžืฉืชืžืฉ ื•-grant_type ื‘ื”ืชืื ืœืžืคืจื˜ ื”ืคืจื•ื˜ื•ืงื•ืœ.

ื‘ืชื’ื•ื‘ื” ื ืงื‘ืœ ืืกื™ืžื•ืŸ Access, ืชืงื•ืคืช ืชื•ืงืคื• ื‘ืฉื ื™ื•ืช ื•-Refresh token ืฉื‘ืืžืฆืขื•ืชื• ื ื•ื›ืœ ืœืขื“ื›ืŸ ืืช ืืกื™ืžื•ืŸ ื”ื’ื™ืฉื”.

ืขืœ ื”ืืคืœื™ืงืฆื™ื” ืœืื—ืกืŸ ื˜ื•ืงื ื™ื ื‘ืžืงื•ื ืžืื•ื‘ื˜ื— ืขื ื—ื™ื™ ืžื“ืฃ ืืจื•ื›ื™ื, ื•ืœื›ืŸ ืขื“ ืฉื ื‘ื˜ืœ ืืช ื”ื’ื™ืฉื” ืฉื”ืชืงื‘ืœื”, ื”ืืคืœื™ืงืฆื™ื” ืœื ืชื—ื–ื™ืจ ืืช ืืกื™ืžื•ืŸ ื”ืจืขื ื•ืŸ. ื‘ืกื•ืฃ, ื”ื•ืกืคืชื™ ื‘ืงืฉื” ืœื‘ื™ื˜ื•ืœ ื”ืืกื™ืžื•ืŸ; ืื ื”ื‘ืงืฉื” ืœื ื”ื•ืฉืœืžื” ื‘ื”ืฆืœื—ื” ื•ืืกื™ืžื•ืŸ ื”ืจืขื ื•ืŸ ืœื ื”ื•ื—ื–ืจ, ื”ื•ื ื™ืชื—ื™ืœ ืืช ื”ื”ืœื™ืš ืžื—ื“ืฉ (ื—ืฉื‘ื ื• ืฉื–ื” ืœื ื‘ื˜ื•ื— ืœืื—ืกืŸ ื˜ื•ืงื ื™ื ืžืงื•ืžื™ืช ื‘ื˜ืจืžื™ื ืœ, ื•ืื ื—ื ื• ืขื•ืฉื™ื ื–ืืช. ืœื ืจื•ืฆื” ืœืกื‘ืš ื“ื‘ืจื™ื ืขื ืงืจื™ืคื˜ื•ื’ืจืคื™ื” ืื• ืœืคืชื•ื— ืืช ื”ื“ืคื“ืคืŸ ืœืขืชื™ื ืงืจื•ื‘ื•ืช).

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'])
      }
    }
  }
}

ื‘ื›ืœ ื‘ืงืฉื”, ืขืœื™ืš ืœืฉืœื•ื— ื›ื•ืชืจืช ื”ืจืฉืื” ื”ืžื›ื™ืœื” ืืช ืกื•ื’ ื”ืืกื™ืžื•ืŸ ื•ืืช ืืกื™ืžื•ืŸ ื”ื’ื™ืฉื” ืขืฆืžื•. ื ื›ื•ืŸ ืœืขื›ืฉื™ื•, ืกื•ื’ ื”ืืกื™ืžื•ืŸ ื”ื•ื ืชืžื™ื“ ื ื•ืฉื. ื›ื™ ืขืœื™ื ื• ืœื‘ื“ื•ืง ืฉืชื•ืงืฃ ื”ืืกื™ืžื•ืŸ ืœื ืคื’ ื•ืœืขื“ื›ืŸ ืื•ืชื• ืœืื—ืจ ืฉืขื” ืžืจื’ืข ื”ื ืคืงืชื•, ืฆื™ื™ื ืชื™ ื‘ืงืฉื” ืœืคื•ื ืงืฆื™ื” ืื—ืจืช ืฉืžื—ื–ื™ืจื” ืืกื™ืžื•ืŸ Access. ืื•ืชื” ืคื™ืกืช ืงื•ื“ ื ืžืฆืืช ื‘ืชื—ื™ืœืช ื”ืกืงืจื™ืคื˜ ื‘ืขืช ืงื‘ืœืช ืืกื™ืžื•ืŸ ื”ื’ื™ืฉื” ื”ืจืืฉื•ืŸ:

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
}

ื‘ืงืฉืช ื”ืื™ืžื™ื™ืœ:$query ืชื‘ืงืฉ ืžื”-API ืœื—ืคืฉ ืžืฉืชืžืฉ ืขื ื”ืื™ืžื™ื™ืœ ื”ื–ื” ื‘ื“ื™ื•ืง, ื›ื•ืœืœ ื›ื™ื ื•ื™ื™ื. ืืชื” ื™ื›ื•ืœ ื’ื ืœื”ืฉืชืžืฉ ื‘ืชื• ื›ืœืœื™: =, :, :{PREFIX}*.

ื›ื“ื™ ืœืงื‘ืœ ื ืชื•ื ื™ื, ื”ืฉืชืžืฉื• ื‘ืฉื™ื˜ืช ื‘ืงืฉืช GET, ืœื”ื›ื ืกืช ื ืชื•ื ื™ื (ื™ืฆื™ืจืช ื—ืฉื‘ื•ืŸ ืื• ื”ื•ืกืคืช ื—ื‘ืจ ืœืงื‘ื•ืฆื”) - POST, ืœืขื“ื›ื•ืŸ ื ืชื•ื ื™ื ืงื™ื™ืžื™ื - PUT, ืœืžื—ื™ืงืช ืจืฉื•ืžื” (ืœื“ื•ื’ืžื”, ื—ื‘ืจ ืžืงื‘ื•ืฆื”) - ืœึดืžึฐื—ื•ึนืง.

ื”ืชืกืจื™ื˜ ื™ื‘ืงืฉ ื’ื ืžืกืคืจ ื˜ืœืคื•ืŸ (ืžื—ืจื•ื–ืช ืœื ืžืื•ืžืชืช) ื•ื”ื›ืœืœื” ื‘ืงื‘ื•ืฆืช ื”ืคืฆื” ืื–ื•ืจื™ืช. ื”ื•ื ืžื—ืœื™ื˜ ืื™ื–ื• ื™ื—ื™ื“ื” ืืจื’ื•ื ื™ืช ืฆืจื™ื›ื” ืœื”ื™ื•ืช ืœืžืฉืชืžืฉ ื‘ื”ืชื‘ืกืก ืขืœ ื”-Active Directory 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
}

ืœืคื•ื ืงืฆื™ื•ืช ืœืขื“ื›ื•ืŸ ื•ื™ืฆื™ืจืช ื—ืฉื‘ื•ืŸ ื™ืฉ ืชื—ื‘ื™ืจ ื“ื•ืžื”; ืœื ื›ืœ ื”ืฉื“ื•ืช ื”ื ื•ืกืคื™ื ื ื“ืจืฉื™ื; ื‘ื—ืœืง ืขื ืžืกืคืจื™ ื˜ืœืคื•ืŸ ื™ืฉ ืœืฆื™ื™ืŸ ืžืขืจืš ืฉื™ื›ื•ืœ ืœื”ื›ื™ืœ ืขื“ ืจืฉื•ืžื” ืื—ืช ืขื ื”ืžืกืคืจ ื•ืกื•ื’ื•.

ืขืœ ืžื ืช ืœื ืœืงื‘ืœ ืฉื’ื™ืื” ื‘ืขืช ื”ื•ืกืคืช ืžืฉืชืžืฉ ืœืงื‘ื•ืฆื”, ื ื•ื›ืœ ืœื‘ื“ื•ืง ืชื—ื™ืœื” ื”ืื ื”ื•ื ื›ื‘ืจ ื—ื‘ืจ ื‘ืงื‘ื•ืฆื” ื–ื• ืขืœ ื™ื“ื™ ืงื‘ืœืช ืจืฉื™ืžืช ื—ื‘ืจื™ ืงื‘ื•ืฆื” ืื• ื”ืจื›ื‘ ืžื”ืžืฉืชืžืฉ ืขืฆืžื•.

ืฉืื™ืœืชืช ื”ื—ื‘ืจื•ืช ื‘ืงื‘ื•ืฆื” ืฉืœ ืžืฉืชืžืฉ ืกืคืฆื™ืคื™ ืœื ืชื”ื™ื” ืจืงื•ืจืกื™ื‘ื™ืช ื•ืชืฆื™ื’ ืจืง ื—ื‘ืจื•ืช ื™ืฉื™ืจื”. ื”ื›ืœืœืช ืžืฉืชืžืฉ ื‘ืงื‘ื•ืฆืช ืื‘ ืฉื›ื‘ืจ ื™ืฉ ืœื” ืงื‘ื•ืฆืช ื™ืœื“ ืฉื”ืžืฉืชืžืฉ ื—ื‘ืจ ื‘ื” ืชืฆืœื™ื—.

ืžืกืงื ื”

ื›ืœ ืฉื ื•ืชืจ ื”ื•ื ืœืฉืœื•ื— ืœืžืฉืชืžืฉ ืืช ื”ืกื™ืกืžื” ืœื—ืฉื‘ื•ืŸ ื”ื—ื“ืฉ. ืื ื• ืขื•ืฉื™ื ื–ืืช ื‘ืืžืฆืขื•ืช SMS, ื•ืฉื•ืœื—ื™ื ืžื™ื“ืข ื›ืœืœื™ ืขื ื”ื ื—ื™ื•ืช ื•ื›ื ื™ืกื” ืœืžื™ื™ืœ ืื™ืฉื™, ืืฉืจ ื™ื—ื“ ืขื ืžืกืคืจ ื˜ืœืคื•ืŸ ื ืžืกืจ ืžืžื—ืœืงืช ื”ื’ื™ื•ืก. ื›ื—ืœื•ืคื”, ืืชื” ื™ื›ื•ืœ ืœื—ืกื•ืš ื›ืกืฃ ื•ืœืฉืœื•ื— ืืช ื”ืกื™ืกืžื” ืฉืœืš ืœืฆ'ืื˜ ื˜ืœื’ืจื ืกื•ื“ื™, ืฉื™ื›ื•ืœ ืœื”ื™ื—ืฉื‘ ื’ื ืœื’ื•ืจื ื”ืฉื ื™ (ืžืงื‘ื•ืงื™ื ื™ื”ื™ื• ื—ืจื™ื’ื™ื).

ืชื•ื“ื” ืฉืงืจืืช ืขื“ ื”ืกื•ืฃ. ืืฉืžื— ืœืจืื•ืช ื”ืฆืขื•ืช ืœืฉื™ืคื•ืจ ืกื’ื ื•ืŸ ื›ืชื™ื‘ืช ืžืืžืจื™ื ื•ืžืื—ืœืช ืœืš ืœืชืคื•ืก ืคื—ื•ืช ืฉื’ื™ืื•ืช ื‘ื›ืชื™ื‘ืช ืกืงืจื™ืคื˜ื™ื =)

ืจืฉื™ืžืช ืงื™ืฉื•ืจื™ื ืฉืขืฉื•ื™ื™ื ืœื”ื™ื•ืช ืฉื™ืžื•ืฉื™ื™ื ืžื‘ื—ื™ื ื” ื ื•ืฉืื™ืช ืื• ืคืฉื•ื˜ ืœืขื ื•ืช ืขืœ ืฉืืœื•ืช:

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”