เบเบฒเบ™เบชเป‰เบฒเบ‡เบœเบนเป‰เปƒเบŠเป‰ Google เบˆเบฒเบ PowerShell เบœเปˆเบฒเบ™ API

Hello!

เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš PowerShell เบเบฑเบš Google API เป€เบžเบทเปˆเบญเบˆเบฑเบ”เบเบฒเบ™เบœเบนเป‰เปƒเบŠเป‰ G Suite.

เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบšเปเบฅเบดเบเบฒเบ™เบžเบฒเบเปƒเบ™ เปเบฅเบฐเบ„เบฅเบฒเบงเบซเบผเบฒเบเบญเบฑเบ™เปƒเบ™เบ—เบปเปˆเบงเบญเบปเบ‡เบเบญเบ™. เบชเปเบฒเบฅเบฑเบšเบชเปˆเบงเบ™เปƒเบซเบเปˆ, เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบ™เบžเบงเบเบกเบฑเบ™เปเบกเปˆเบ™เบกเบฒเบˆเบฒเบ Google เบซเบผเบท Active Directory, เบฅเบฐเบซเบงเปˆเบฒเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เบฎเบฑเบเบชเบฒเบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡; เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบกเบทเปˆเบญเบžเบฐเบ™เบฑเบเบ‡เบฒเบ™เปƒเบซเบกเปˆเบญเบญเบเป„เบ›, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡ / เป€เบ›เบตเบ”เปƒเบŠเป‰เบšเบฑเบ™เบŠเบตเปƒเบ™เบชเบญเบ‡เบฅเบฐเบšเบปเบšเบ™เบตเป‰. เป€เบžเบทเปˆเบญเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบ‚เบฐเบšเบงเบ™เบเบฒเบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ‚เบฝเบ™เบชเบฐเบ„เบดเบšเบ—เบตเปˆเป€เบเบฑเบšเบเปเบฒเบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเบชเบปเปˆเบ‡เปƒเบซเป‰เบ—เบฑเบ‡เบชเบญเบ‡เบšเปเบฅเบดเบเบฒเบ™.

เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”

เป€เบกเบทเปˆเบญเบชเป‰เบฒเบ‡เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ™เปเบฒเปƒเบŠเป‰เบœเบนเป‰เบšเปเบฅเบดเบซเบฒเบ™เบ‚เบญเบ‡เบกเบฐเบ™เบธเบ”เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”; เบ™เบตเป‰เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเป‚เบ”เบเบšเบฑเบ‡เป€เบญเบตเบ™เบซเบผเบทเป‚เบ”เบเป€เบˆเบ”เบ•เบฐเบ™เบฒ.

Google APIs เปƒเบŠเป‰เป‚เบ›เบฃเป‚เบ•เบ„เป OAuth 2.0 เบชเบณเบฅเบฑเบšเบเบฒเบ™เบžเบดเบชเบนเบ”เบขเบทเบ™เบขเบฑเบ™ เปเบฅเบฐเบญเบฐเบ™เบธเบเบฒเบ”. เบเปเบฅเบฐเบ™เบตเบเบฒเบ™เบ™เบณเปƒเบŠเป‰ เปเบฅเบฐเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เบ—เบตเปˆเบ™เบตเป‰: เปƒเบŠเป‰ OAuth 2.0 เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ Google APIs.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบฅเบทเบญเบเบชเบฐเบ„เบดเบšเบ—เบตเปˆเปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ desktop. เบเบฑเบ‡เบกเบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เบšเบฑเบ™เบŠเบตเบšเปเบฅเบดเบเบฒเบ™, เป€เบŠเบดเปˆเบ‡เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบกเบตเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ—เบตเปˆเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบˆเบฒเบเบœเบนเป‰เปƒเบŠเป‰.

เบฎเบนเบšเบžเบฒเบšเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบกเปˆเบ™เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเปเบšเบšเปเบœเบ™เบ‚เบญเบ‡เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเป€เบฅเบทเบญเบเบˆเบฒเบเบซเบ™เป‰เบฒ Google.

เบเบฒเบ™เบชเป‰เบฒเบ‡เบœเบนเป‰เปƒเบŠเป‰ Google เบˆเบฒเบ PowerShell เบœเปˆเบฒเบ™ API

  1. เบ—เปเบฒเบญเบดเบ”, เบžเบงเบเป€เบฎเบปเบฒเบชเบปเปˆเบ‡เบœเบนเป‰เปƒเบŠเป‰เป„เบ›เบซเบฒเบซเบ™เป‰เบฒเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบšเบฑเบ™เบŠเบต Google, เบฅเบฐเบšเบธเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต GET:
    • เป„เบญเบ”เบตเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™
    • เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡
    • เบ—เบตเปˆเบขเบนเปˆเบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰เบˆเบฐเบ–เบทเบเบ›เปˆเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบซเบผเบฑเบ‡เบˆเบฒเบเบชเปเบฒเป€เบฅเบฑเบ”เบ‚เบฑเป‰เบ™เบ•เบญเบ™
    • เบงเบดเบ—เบตเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เบฑเบšเบ›เบธเบ‡ token
    • เบฅเบฐโ€‹เบซเบฑเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ›เบญเบ”โ€‹เป„เบž
    • เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบฅเบฐเบซเบฑเบ”เบขเบทเบ™เบขเบฑเบ™

  2. เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบเบฒเบ™โ€‹เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เบชเปเบฒโ€‹เป€เบฅเบฑเบ”โ€‹เปเบฅเป‰เบงโ€‹, เบœเบนเป‰โ€‹เปƒเบŠเป‰โ€‹เบˆเบฐโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เป‚เบญเบ™โ€‹เป„เบ›โ€‹เบซเบฒโ€‹เบซเบ™เป‰เบฒโ€‹เบ—เบตเปˆโ€‹เบฅเบฐโ€‹เบšเบธโ€‹เป„เบงเป‰โ€‹เปƒเบ™โ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบ—เปเบฒโ€‹เบญเบดเบ”โ€‹, เบกเบตโ€‹เบ‚เปเป‰โ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹เบซเบผเบทโ€‹เบฅเบฐโ€‹เบซเบฑเบ”โ€‹เบเบฒเบ™โ€‹เบญเบฐโ€‹เบ™เบธโ€‹เบเบฒเบ”โ€‹เบœเปˆเบฒเบ™โ€‹เบžเบฒโ€‹เบฅเบฒโ€‹เบกเบดโ€‹เป€เบ•เบต GETโ€‹.
  3. เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ (script) เบˆเบฐเบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบฅเบฐ, เบ–เป‰เบฒเป„เบ”เป‰เบฎเบฑเบšเบฅเบฐเบซเบฑเบ”, เปƒเบซเป‰เป€เบฎเบฑเบ”เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเป„เบ›เบ™เบตเป‰เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰ tokens.
  4. เบ–เป‰เบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ–เบทเบเบ•เป‰เบญเบ‡, Google API เบเบฑเบšเบ„เบทเบ™เบกเบฒ:
    • เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ token เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป
    • เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบ‚เบญเบ‡ token เบ™เบตเป‰
    • เบ•เป‰เบญเบ‡เป‚เบซเบผเบ” token เบ„เบทเบ™เปƒเปเปˆเป€เบžเบทเปˆเบญเป‚เบซเบผเบ” token เบ„เบทเบ™เปƒเปเปˆ.

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ” เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เป„เบ›เบ—เบตเปˆ Google API console: เบ‚เปเป‰เบกเบนเบ™เบ›เบฐเบˆเปเบฒเบ•เบปเบง - Google API Console, เป€เบฅเบทเบญเบเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™ เปเบฅเบฐเปƒเบ™เบชเปˆเบงเบ™ Credentials เบชเป‰เบฒเบ‡เบ•เบปเบงเบฅเบฐเบšเบธ OAuth เบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒ. เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™ (เบซเบผเบทเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เปƒเบ™เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡เบ•เบปเบงเบฅเบฐเบšเบธเบ—เบตเปˆเบชเป‰เบฒเบ‡) โ€‹โ€‹เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบฅเบฐเบšเบธเบ—เบตเปˆเบขเบนเปˆเบ—เบตเปˆเบเบฒเบ™เบ›เปˆเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ–เบทเบเบญเบฐเบ™เบธเบเบฒเบ”. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบˆเบฐเป€เบ›เบฑเบ™ localhost เบซเบผเบฒเบเบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเบกเบตเบžเบญเบ”เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™ (เป€เบšเบดเปˆเบ‡เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰).

เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบชเบฐเบ”เบงเบเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบญเปˆเบฒเบ™ script algorithm, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบฐเปเบ”เบ‡เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เปเบฒเบญเบดเบ”เปƒเบ™เบŸเบฑเบ‡เบŠเบฑเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ—เบตเปˆเบˆเบฐเบเบฑเบšเบ„เบทเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เปเบฅเบฐเป‚เบซเบผเบ”เบซเบ™เป‰เบฒเบˆเปเบ„เบทเบ™ tokens เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ:

$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

เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบ™เบปเบ” Client ID เปเบฅเบฐเบ„เบงเบฒเบกเบฅเบฑเบšเบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒเบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเปƒเบ™เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ•เบปเบงเบฅเบฐเบšเบธเบฅเบนเบเบ„เป‰เบฒ OAuth, เปเบฅเบฐเบ•เบปเบงเบเบงเบ”เบชเบญเบšเบฅเบฐเบซเบฑเบ”เปเบกเปˆเบ™เบชเบฐเบ•เบฃเบดเบ‡เบ‚เบญเบ‡ 43 เบซเบฒ 128 เบ•เบปเบงเบญเบฑเบเบชเบญเบ™เบ—เบตเปˆเบ•เป‰เบญเบ‡เบ–เบทเบเบชเป‰เบฒเบ‡เปเบšเบšเบชเบธเปˆเบกเบˆเบฒเบเบ•เบปเบงเบญเบฑเบเบชเบญเบ™เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบˆเบญเบ‡: [AZ] / [az] / [0-9] / "-" / "." / "_" / "~".

เบฅเบฐเบซเบฑเบ”เบ™เบตเป‰เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบ•เปเปˆเบญเบตเบเบ„เบฑเป‰เบ‡. เบกเบฑเบ™เบเปเบฒเบˆเบฑเบ”เบŠเปˆเบญเบ‡เป‚เบซเบงเปˆเบ—เบตเปˆเบœเบนเป‰เป‚เบˆเบกเบ•เบตเบชเบฒเบกเบฒเบ”เบ‚เบฑเบ”เบ‚เบงเบฒเบ‡เบเบฒเบ™เบ•เบญเบšเป‚เบ•เป‰เบ„เบทเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰.
เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เบ•เบปเบงเบเบงเบ”เบชเบญเบšเบฅเบฐเบซเบฑเบ”เปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เป€เบ›เบฑเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™ (เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบกเบฑเบ™เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบซเบกเบฒเบ - เบ™เบตเป‰เปเบกเปˆเบ™เป€เบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบšเบฅเบฐเบšเบปเบšเบ—เบตเปˆเบšเปเปˆเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ SHA256), เบซเบผเบทเป‚เบ”เบเบเบฒเบ™เบชเป‰เบฒเบ‡ hash เป‚เบ”เบเปƒเบŠเป‰ SHA256 algorithm, เป€เบŠเบดเปˆเบ‡เบ•เป‰เบญเบ‡เบ–เบทเบเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เปƒเบ™ BASE64Url (เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบˆเบฒเบ Base64 เป‚เบ”เบเบชเบญเบ‡เบ•เบปเบงเบญเบฑเบเบชเบญเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡) เปเบฅเบฐเป€เบญเบปเบฒเบเบฒเบ™เบชเบดเป‰เบ™เบชเบธเบ”เป€เบชเบฑเป‰เบ™เบ•เบปเบงเบญเบฑเบเบชเบญเบ™: =.

เบ•เปเปˆเป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบŸเบฑเบ‡ http เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เป€เบžเบทเปˆเบญเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡.

เบงเบฝเบเบ‡เบฒเบ™เบšเปเบฅเบดเบซเบฒเบ™เปเบกเปˆเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบžเบดเป€เบชเบ”, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเป€เบชเบ”เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบœเบนเป‰เบšเปเบฅเบดเบซเบฒเบ™เบซเบผเบฒเบเบ„เบปเบ™เบˆเบฐเปเบฅเปˆเบ™เบชเบฐเบ„เบดเบšเปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบกเบฑเบ™เบˆเบฐเป€เบฅเบทเบญเบเบžเบญเบ”เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เบ›เบฐเบˆเบธเบšเบฑเบ™เปเบšเบšเบชเบธเปˆเบก, เปเบ•เปˆเบ‚เป‰เบญเบเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”เบžเบญเบ”เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เบเปˆเบญเบ™เป€เบžเบฒเบฐเบงเปˆเบฒ เบžเบงเบเป€เบ‚เบปเบฒเบเบฑเบ‡เบ•เป‰เบญเบ‡เบ–เบทเบเป€เบžเบตเปˆเบกเป€เบ›เบฑเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เปƒเบ™ API console.

access_type=offline เปเบฒเบ เบ„เบงเบฒเบกเบงเปˆเบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบชเบฒเบกเบฒเบ”เบญเบฑเบšเป€เบ”เบ” token เบ—เบตเปˆเปเบปเบ”เบญเบฒเบเบธเบ”เป‰เบงเบเบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบเบฑเบšเบœเบนเป‰เปƒเบŠเป‰เบเบฑเบš browser,
response_type=เบฅเบฐเบซเบฑเบ” เบเปเบฒเบ™เบปเบ”เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เบงเบดเบ—เบตเบ—เบตเปˆเบฅเบฐเบซเบฑเบ”เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™ (เบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบตเบ‡เป€เบ–เบดเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เป€เบเบปเปˆเบฒ, เป€เบกเบทเปˆเบญเบœเบนเป‰เปƒเบŠเป‰เบ„เบฑเบ”เบฅเบญเบเบฅเบฐเบซเบฑเบ”เบˆเบฒเบเบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบชเบฐเบ„เบดเบš),
เบ‚เบญเบšเป€เบ‚เบ” เบŠเบตเป‰เบšเบญเบเบ‚เบญเบšเป€เบ‚เบ” เปเบฅเบฐเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡. เบžเบงเบเบกเบฑเบ™เบ•เป‰เบญเบ‡เบ–เบทเบเปเบเบเบญเบญเบเบ”เป‰เบงเบเบŠเปˆเบญเบ‡เบซเบงเปˆเบฒเบ‡ เบซเบผเบท %20 (เบญเบตเบ‡เบ•เบฒเบกเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ” URL). เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบžเบทเป‰เบ™เบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ—เบตเปˆเบกเบตเบ›เบฐเป€เบžเบ”เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป„เบ”เป‰เบ—เบตเปˆเบ™เบตเป‰: OAuth 2.0 เบ‚เบญเบšเป€เบ‚เบ”เบชเปเบฒเบฅเบฑเบš Google APIs.

เบซเบผเบฑเบ‡เบˆเบฒเบเป„เบ”เป‰เบฎเบฑเบšเบฅเบฐเบซเบฑเบ”เบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”, เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบˆเบฐเบชเบปเปˆเบ‡เบ„เบทเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเปƒเบเป‰เบŠเบดเบ”เบเบฑเบšเบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš, เบขเบธเบ”เบŸเบฑเบ‡เบขเบนเปˆเปƒเบ™เบžเบญเบ”เปเบฅเบฐเบชเบปเปˆเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป POST เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบฎเบฑเบš token. เบžเบงเบเป€เบฎเบปเบฒเบŠเบตเป‰เบšเบญเบเบขเบนเปˆเปƒเบ™เบกเบฑเบ™ id เบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เปเบฅเบฐเบ„เบงเบฒเบกเบฅเบฑเบšเบˆเบฒเบ console API, เบ—เบตเปˆเบขเบนเปˆเบœเบนเป‰เปƒเบŠเป‰เบˆเบฐเบ–เบทเบเป‚เบญเบ™เปเบฅเบฐ grant_type เบ•เบฒเบกเบ‚เปเป‰เบเปเบฒเบ™เบปเบ”เบ‚เบญเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™.

เปƒเบ™เบเบฒเบ™เบ•เบญเบšเบชเบฐเปœเบญเบ‡, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเป‚เบ—เป€เบ„เบฑเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡, เป„เบฅเบเบฐเป€เบงเบฅเบฒเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เบ‚เบญเบ‡เบกเบฑเบ™เป€เบ›เบฑเบ™เบงเบดเบ™เบฒเบ—เบต, เปเบฅเบฐเป‚เบ—เป€เบ„เบฑเบ™เป‚เบซเบผเบ”เบ‚เปเป‰เบกเบนเบ™เบ„เบทเบ™เปƒเปเปˆ, เป€เบŠเบดเปˆเบ‡เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบญเบฑเบšเป€เบ”เบ”เป€เบ„เบทเปˆเบญเบ‡เปเบฒเบเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰.

เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ•เป‰เบญเบ‡เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ tokens เปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เบตเปˆเบ›เบญเบ”เป„เบžเบ—เบตเปˆเบกเบตเบŠเบตเบงเบดเบ”เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบเบฒเบง, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบˆเบปเบ™เบเปˆเบงเบฒเบžเบงเบเป€เบฎเบปเบฒเบ–เบญเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบš, เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบˆเบฐเบšเปเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™ token เป‚เบซเบผเบ”เบซเบ™เป‰เบฒเบˆเปเบ„เบทเบ™. เปƒเบ™เบ—เบตเปˆเบชเบธเบ”, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบžเบตเปˆเบกเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเปƒเบซเป‰เบ–เบญเบ™ token; เบ–เป‰เบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบšเปเปˆเบชเปเบฒเป€เบฅเบฑเบ”เปเบฅเบฐ refresh token เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบชเบปเปˆเบ‡เบ„เบทเบ™, เบกเบฑเบ™เบˆเบฐเป€เบฅเบตเปˆเบกเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡ (เบžเบงเบเป€เบฎเบปเบฒเบ–เบทเบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเบ›เบญเบ”เป„เบžเบ—เบตเปˆเบˆเบฐเป€เบเบฑเบšเบฎเบฑเบเบชเบฒ tokens เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบ›เบญเบ”เป„เบž. 'เบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบชเบฑเบšเบชเบปเบ™เบเบฑเบš cryptography เบซเบผเบทเป€เบ›เบตเบ”เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเป€เบฅเบทเป‰เบญเบเป†).

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
}

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เป„เบ”เป‰เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เปเบฅเป‰เบง, เป€เบกเบทเปˆเบญเบ–เบญเบ™ token, Invoke-WebRequest เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰. เบšเปเปˆเป€เบซเบกเบทเบญเบ™เบเบฑเบš Invoke-RestMethod, เบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เบชเบปเปˆเบ‡เบ„เบทเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเปƒเบ™เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เปเบฅเบฐเบชเบฐเปเบ”เบ‡เบชเบฐเบ–เบฒเบ™เบฐเบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป.

เบ•เปเปˆเป„เบ›, script เบ‚เปเปƒเบซเป‰เป€เบˆเบปเป‰เบฒเปƒเบชเปˆเบŠเบทเปˆเปเบฅเบฐเบ™เบฒเบกเบชเบฐเบเบธเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰, เบชเป‰เบฒเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš + เบญเบตเป€เบกเบง.

เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป

เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเป„เบ›เบˆเบฐเป€เบ›เบฑเบ™ - เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเบกเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบ”เบฝเบงเบเบฑเบ™เบกเบตเบขเบนเปˆเบเปˆเบญเบ™เปเบฅเป‰เบงเป€เบžเบทเปˆเบญเปƒเบซเป‰เบกเบตเบเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเปƒเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เปƒเบซเบกเปˆเบซเบผเบทเบเบฒเบ™เป€เบ›เบตเบ”เปƒเบŠเป‰เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆเบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ„เบฑเบ”เป€เบฅเบทเบญเบ, เป‚เบ”เบเปƒเบŠเป‰เบ›เบธเปˆเบก:

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

เปƒเบ™เปเบ•เปˆเบฅเบฐเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเบปเปˆเบ‡เบซเบปเบงเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เบ—เบตเปˆเบกเบตเบ›เบฐเป€เบžเบ” token เปเบฅเบฐ Access token เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เบ›เบฐเป€เบžเบ” token เปเบกเปˆเบ™เบชเบฐเป€เบซเบกเบต Bearer. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒ token เบšเปเปˆเบซเบกเบปเบ”เบญเบฒเบเบธเปเบฅเบฐเบ›เบฑเบšเบ›เบธเบ‡เบกเบฑเบ™เบซเบผเบฑเบ‡เบˆเบฒเบเบซเบ™เบถเปˆเบ‡เบŠเบปเปˆเบงเป‚เบกเบ‡เบˆเบฒเบเป€เบงเบฅเบฒเบ—เบตเปˆเบกเบฑเบ™เบ–เบทเบเบญเบญเบ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบฅเบฐเบšเบธเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบชเปเบฒเบฅเบฑเบšเบŸเบฑเบ‡เบŠเบฑเบ™เบญเบทเปˆเบ™เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™ token เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡. เบŠเบดเป‰เบ™เบชเปˆเบงเบ™เบ”เบฝเบงเบเบฑเบ™เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบ•เบญเบ™เบ•เบปเป‰เบ™เบ‚เบญเบ‡เบชเบฐเบ„เบฃเบดเบšเป€เบกเบทเปˆเบญเป„เบ”เป‰เบฎเบฑเบš token เบ—เปเบฒเบญเบดเบ” 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 request เบˆเบฐเบ‚เปเปƒเบซเป‰ API เบŠเบญเบเบซเบฒเบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเบกเบตเบญเบตเป€เบกเบงเบ™เบฑเป‰เบ™เปเบ—เป‰เป†, เบฅเบงเบกเบ—เบฑเบ‡เบ™เบฒเบกเปเบเบ‡. เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰ wildcard: =, :, :{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
}

เบซเบ™เป‰เบฒเบ—เบตเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เปเบฅเบฐเบชเป‰เบฒเบ‡เบšเบฑเบ™เบŠเบตเบกเบต syntax เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™; เบšเปเปˆเปเบกเปˆเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™; เปƒเบ™เบชเปˆเบงเบ™เบ—เบตเปˆเบกเบตเป€เบšเบตเป‚เบ—เบฅเบฐเบชเบฑเบš, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฅเบฐเบšเบธ array เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบšเบฑเบ™เบˆเบธเป„เบ”เป‰เป€เบ–เบดเบ‡เบซเบ™เบถเปˆเบ‡เบšเบฑเบ™เบ—เบถเบเบ—เบตเปˆเบกเบตเบˆเปเบฒเบ™เบงเบ™เปเบฅเบฐเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบกเบฑเบ™.

เป€เบžเบทเปˆเบญเบšเปเปˆเปƒเบซเป‰เบกเบตเบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบžเบตเปˆเบกเบœเบนเป‰เปƒเบŠเป‰เป€เบ‚เบปเป‰เบฒเปƒเบ™เบเบธเปˆเบก, เบ—เปเบฒเบญเบดเบ”เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเปˆเบฒเบฅเบฒเบงเป€เบ›เบฑเบ™เบชเบฐเบกเบฒเบŠเบดเบเบ‚เบญเบ‡เบเบธเปˆเบกเบ™เบตเป‰เปเบฅเป‰เบงเป‚เบ”เบเบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบชเบฐเบกเบฒเบŠเบดเบเบเบธเปˆเบกเบซเบผเบทเบญเบปเบ‡เบ›เบฐเบเบญเบšเบˆเบฒเบเบœเบนเป‰เปƒเบŠเป‰เป€เบญเบ‡.

เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบเบฒเบ™เป€เบ›เบฑเบ™เบชเบฐเบกเบฒเบŠเบดเบเบเบธเปˆเบกเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เบชเบฐเป€เบžเบฒเบฐเปƒเบ”เปœเบถเปˆเบ‡เบˆเบฐเบšเปเปˆเป€เบ›เบฑเบ™เบเบฒเบ™เป€เบญเบตเป‰เบ™เบ„เบทเบ™ เปเบฅเบฐเบˆเบฐเบชเบฐเปเบ”เบ‡เบเบฒเบ™เป€เบ›เบฑเบ™เบชเบฐเบกเบฒเบŠเบดเบเป‚เบ”เบเบเบปเบ‡เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. เบฅเบงเบกเบ—เบฑเบ‡เบœเบนเป‰เปƒเบŠเป‰เบขเบนเปˆเปƒเบ™เบเบธเปˆเบกเบžเปเปˆเปเบกเปˆเบ—เบตเปˆเบกเบตเบเบธเปˆเบกเป€เบ”เบฑเบเบ™เป‰เบญเบเบขเบนเปˆเปเบฅเป‰เบงเบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰เป€เบ›เบฑเบ™เบชเบฐเบกเบฒเบŠเบดเบเบˆเบฐเบ›เบฐเบชเบปเบšเบœเบปเบ™เบชเปเบฒเป€เบฅเบฑเบ”.

เบชเบฐเบซเบฅเบธเบš

เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบชเบปเปˆเบ‡เบœเบนเป‰เปƒเบŠเป‰เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบšเบฑเบ™เบŠเบตเปƒเบซเบกเปˆ. เบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰เบœเปˆเบฒเบ™ SMS, เปเบฅเบฐเบชเบปเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบปเปˆเบงเป„เบ›เบ”เป‰เบงเบเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเปเบฅเบฐเป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบญเบตเป€เบกเบงเบชเปˆเบงเบ™เบ•เบปเบง, เป€เบŠเบดเปˆเบ‡, เบžเป‰เบญเบกเบเบฑเบšเป€เบšเบตเป‚เบ—เบฅเบฐเบชเบฑเบš, เป„เบ”เป‰เบ–เบทเบเบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เป‚เบ”เบเบžเบฐเปเบ™เบเบเบฒเบ™เบˆเป‰เบฒเบ‡เบ‡เบฒเบ™. เป€เบ›เบฑเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบ, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบซเบเบฑเบ”เป€เบ‡เบดเบ™เปเบฅเบฐเบชเบปเปˆเบ‡เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป„เบ›เบซเบฒเบเบฒเบ™เบชเบปเบ™เบ—เบฐเบ™เบฒ telegram เบฅเบฑเบš, เป€เบŠเบดเปˆเบ‡เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ›เบฑเบ”เป„เบˆเบ—เบตเบชเบญเบ‡ (MacBooks เบˆเบฐเป€เบ›เบฑเบ™เบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™).

เบ‚เบญเบšเปƒเบˆเบ—เบตเปˆเบญเปˆเบฒเบ™เบˆเบปเบ™เบˆเบปเบš. เบ‚เป‰เบญเบเบˆเบฐเบ”เบตเปƒเบˆเบ—เบตเปˆเบˆเบฐเป€เบซเบฑเบ™เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบ‚เบฝเบ™เบšเบปเบ”เบ„เบงเบฒเบกเปเบฅเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบซเป‰เบ—เปˆเบฒเบ™เบˆเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบซเบ™เป‰เบญเบเบฅเบปเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ‚เบฝเบ™ scripts =)

เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเบญเบฒเบ”เบˆเบฐเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบฒเบ‡เบ—เบดเบ”เบชเบฐเบ”เบตเบซเบผเบทเบžเบฝเบ‡เปเบ•เปˆเบ•เบญเบšเบ„เปเบฒเบ–เบฒเบก:

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™