БоздавањС корисници Π½Π° Google ΠΎΠ΄ PowerShell ΠΏΡ€Π΅ΠΊΡƒ API

Π—Π΄Ρ€Π°Π²ΠΎ!

Оваа ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° ќС ја опишС ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° PowerShell со Google API Π·Π° ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€Π°ΡšΠ΅ со корисницитС Π½Π° G Suite.

НиС користимС Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π²Π½Π°Ρ‚Ρ€Π΅ΡˆΠ½ΠΈ ΠΈ ΠΎΠ±Π»Π°ΠΊ услуги Π½ΠΈΠ· ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°. Π’ΠΎ најголСм Π΄Π΅Π», ΠΎΠ²Π»Π°ΡΡ‚ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π²ΠΎ Π½ΠΈΠ² сС свСдува Π½Π° Google ΠΈΠ»ΠΈ Active Directory, ΠΌΠ΅Ρ“Ρƒ ΠΊΠΎΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΎΠ΄Ρ€ΠΆΡƒΠ²Π°ΠΌΠ΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°; соодвСтно, ΠΊΠΎΠ³Π° ќС Π·Π°ΠΌΠΈΠ½Π΅ Π½ΠΎΠ² Π²Ρ€Π°Π±ΠΎΡ‚Π΅Π½, Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅/ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈΡ‚Π΅ смСтка Π²ΠΎ ΠΎΠ²ΠΈΠ΅ Π΄Π²Π° систСми. Π—Π° Π΄Π° Π³ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ процСсот, Ρ€Π΅ΡˆΠΈΠ²ΠΌΠ΅ Π΄Π° напишСмС скрипта ΡˆΡ‚ΠΎ собира ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈ Π³ΠΈ ΠΈΡΠΏΡ€Π°ΡœΠ° Π΄ΠΎ Π΄Π²Π΅Ρ‚Π΅ услуги.

ΠžΠ²Π»Π°ΡΡ‚ΡƒΠ²Π°ΡšΠ΅

ΠŸΡ€ΠΈ ΠΈΠ·Π³ΠΎΡ‚Π²ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Π±Π°Ρ€Π°ΡšΠ°Ρ‚Π°, Ρ€Π΅ΡˆΠΈΠ²ΠΌΠ΅ Π΄Π° користимС вистински Ρ‡ΠΎΠ²Π΅Ρ‡ΠΊΠΈ администратори Π·Π° ΠΎΠ²Π»Π°ΡΡ‚ΡƒΠ²Π°ΡšΠ΅; ΠΎΠ²Π° ја поСдноставува Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚Π° Π½Π° активноститС Π²ΠΎ ΡΠ»ΡƒΡ‡Π°Ρ˜ Π½Π° ΡΠ»ΡƒΡ‡Π°Ρ˜Π½ΠΈ ΠΈΠ»ΠΈ Π½Π°ΠΌΠ΅Ρ€Π½ΠΈ масивни ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ.

Google API Π³ΠΎ користат ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΡ‚ OAuth 2.0 Π·Π° Π°Π²Ρ‚Π΅Π½Ρ‚ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Π°. Π‘Π»ΡƒΡ‡Π°ΠΈ Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° ΠΈ ΠΏΠΎΠ΄Π΅Ρ‚Π°Π»Π½ΠΈ описи ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°Ρ˜Π΄Π°Ρ‚ ΠΎΠ²Π΄Π΅: ΠšΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° OAuth 2.0 Π·Π° пристап Π΄ΠΎ Google API.

Π“ΠΎ ΠΈΠ·Π±Ρ€Π°Π² скриптата ΡˆΡ‚ΠΎ сС користи Π·Π° Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Π²ΠΎ дСсктоп Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈΡ‚Π΅. ΠŸΠΎΡΡ‚ΠΎΠΈ ΠΈ ΠΎΠΏΡ†ΠΈΡ˜Π° Π·Π° ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° сСрвисна смСтка, која Π½Π΅ Π±Π°Ρ€Π° Π½Π΅ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ двиТСња ΠΎΠ΄ корисникот.

Π‘Π»ΠΈΠΊΠ°Ρ‚Π° ΠΏΠΎΠ΄ΠΎΠ»Ρƒ Π΅ ΡˆΠ΅ΠΌΠ°Ρ‚ΡΠΊΠΈ опис Π½Π° ΠΈΠ·Π±Ρ€Π°Π½ΠΎΡ‚ΠΎ сцСнарио ΠΎΠ΄ страницата Π½Π° Google.

БоздавањС корисници Π½Π° Google ΠΎΠ΄ PowerShell ΠΏΡ€Π΅ΠΊΡƒ API

  1. ΠŸΡ€Π²ΠΎ, Π³ΠΎ ΠΈΡΠΏΡ€Π°ΡœΠ°ΠΌΠ΅ корисникот Π½Π° страницата Π·Π° Π°Π²Ρ‚Π΅Π½Ρ‚ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π½Π° смСтката Π½Π° Google, Π½Π°Π²Π΅Π΄ΡƒΠ²Π°Ρ˜ΡœΠΈ Π³ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ GET:
    • ΠΈΠ΄ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°
    • области Π΄ΠΎ ΠΊΠΎΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΈΠΌΠ° ΠΏΠΎΡ‚Ρ€Π΅Π±Π° ΠΎΠ΄ пристап
    • адрСсата Π½Π° која ќС Π±ΠΈΠ΄Π΅ прСнасочСн корисникот ΠΏΠΎ Π·Π°Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° постапката
    • Π½Π°Ρ‡ΠΈΠ½ΠΎΡ‚ Π½Π° кој ќС Π³ΠΎ Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΠΌΠ΅ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΡ‚
    • БСзбСдносСн ΠΊΠΎΠ΄
    • Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π° прСнос Π½Π° ΠΊΠΎΠ΄ΠΎΡ‚ Π·Π° Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°

  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 (Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎ ΠΎΠ΄ Base64 со Π΄Π²Π° Π·Π½Π°ΠΊΠ° ΠΎΠ΄ Ρ‚Π°Π±Π΅Π»Π°Ρ‚Π°) ΠΈ ΠΎΡ‚ΡΡ‚Ρ€Π°Π½ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π·Π°Π²Ρ€ΡˆΠ΅Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ Π½Π° линискитС Π»ΠΈΠ½ΠΈΠΈ: =.

Π‘Π»Π΅Π΄Π½ΠΎ, Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΏΠΎΡ‡Π½Π΅ΠΌΠ΅ Π΄Π° ΡΠ»ΡƒΡˆΠ°ΠΌΠ΅ http Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π°Ρ‚Π° машина Π·Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€ ΠΏΠΎ ΠΎΠ²Π»Π°ΡΡ‚ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ, кој ќС Π±ΠΈΠ΄Π΅ Π²Ρ€Π°Ρ‚Π΅Π½ ΠΊΠ°ΠΊΠΎ ΠΏΡ€Π΅Π½Π°ΡΠΎΡ‡ΡƒΠ²Π°ΡšΠ΅.

АдминистративнитС Π·Π°Π΄Π°Ρ‡ΠΈ сС ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°Π°Ρ‚ Π½Π° посСбСн сСрвСр, Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ја исклучимС моТноста Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ администратори Π΄Π° ја ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°Π°Ρ‚ скриптата Π²ΠΎ исто Π²Ρ€Π΅ΠΌΠ΅, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ ΡΠ»ΡƒΡ‡Π°Ρ˜Π½ΠΎ ќС ΠΈΠ·Π±Π΅Ρ€Π΅ ΠΏΠΎΡ€Ρ‚Π° Π·Π° Ρ‚Π΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ‚ корисник, Π½ΠΎ јас Π½Π°Π²Π΅Π΄ΠΎΠ² ΠΏΡ€Π΅Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ ΠΏΠΎΡ€Ρ‚ΠΈ бидСјќи Ρ‚ΠΈΠ΅ исто Ρ‚Π°ΠΊΠ° ΠΌΠΎΡ€Π° Π΄Π° сС Π΄ΠΎΠ΄Π°Π΄Π°Ρ‚ ΠΊΠ°ΠΊΠΎ Π΄ΠΎΠ²Π΅Ρ€Π»ΠΈΠ²ΠΈ Π²ΠΎ ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° API.

пристап_Ρ‚ΠΈΠΏ=ΠΎΡ„Π»Π°Ρ˜Π½ Π·Π½Π°Ρ‡ΠΈ Π΄Π΅ΠΊΠ° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΌΠΎΠΆΠ΅ сама Π΄Π° Π°ΠΆΡƒΡ€ΠΈΡ€Π° истСчСн Ρ‚ΠΎΠΊΠ΅Π½ Π±Π΅Π· корисничка ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ†ΠΈΡ˜Π° со прСлистувачот,
ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€_Ρ‚ΠΈΠΏ=ΡˆΠΈΡ„Ρ€Π° Π³ΠΎ поставува Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΡ‚ ΠΊΠ°ΠΊΠΎ ќС сС Π²Ρ€Π°Ρ‚ΠΈ ΠΊΠΎΠ΄ΠΎΡ‚ (ΡƒΠΏΠ°Ρ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° стариот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π° Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Π°, ΠΊΠΎΠ³Π° корисникот Π³ΠΎ ΠΊΠΎΠΏΠΈΡ€Π°Π» ΠΊΠΎΠ΄ΠΎΡ‚ ΠΎΠ΄ прСлистувачот Π²ΠΎ скриптата),
опсСгот Π³ΠΎ ΠΎΠ·Π½Π°Ρ‡ΡƒΠ²Π° ΠΎΠ±Π΅ΠΌΠΎΡ‚ ΠΈ Π²ΠΈΠ΄ΠΎΡ‚ Π½Π° пристапот. Π’ΠΈΠ΅ ΠΌΠΎΡ€Π° Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ ΠΎΠ΄Π΄Π΅Π»Π΅Π½ΠΈ со ΠΏΡ€Π°Π·Π½ΠΈ мСста ΠΈΠ»ΠΈ %20 (спорСд ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° URL-Ρ‚ΠΎ). Бписокот Π½Π° области Π·Π° пристап со Ρ‚ΠΈΠΏΠΎΠ²ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ ΠΎΠ²Π΄Π΅: ΠžΠΏΡΠ΅Π³ΠΎΡ‚ Π½Π° OAuth 2.0 Π·Π° API Π½Π° Google.

По Π΄ΠΎΠ±ΠΈΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ΄ΠΎΡ‚ Π·Π° Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Π°, Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ќС Π²Ρ€Π°Ρ‚ΠΈ блиска ΠΏΠΎΡ€Π°ΠΊΠ° Π΄ΠΎ прСлистувачот, ќС прСстанС Π΄Π° ΡΠ»ΡƒΡˆΠ° Π½Π° ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π° ΠΈ ќС испрати Π±Π°Ρ€Π°ΡšΠ΅ POST Π·Π° Π΄Π° Π³ΠΎ Π΄ΠΎΠ±ΠΈΠ΅ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΡ‚. Π’ΠΎ Π½Π΅Π³ΠΎ Π³ΠΎ ΠΎΠ·Π½Π°Ρ‡ΡƒΠ²Π°ΠΌΠ΅ ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΎΡ‚ ID ΠΈ Ρ‚Π°Ρ˜Π½Π°Ρ‚Π° ΠΎΠ΄ 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'])
      }
    }
  }
}

Π’ΠΎ сСкоС Π±Π°Ρ€Π°ΡšΠ΅, Ρ‚Ρ€Π΅Π±Π° Π΄Π° испратитС Π·Π°Π³Π»Π°Π²ΠΈΠ΅ Π·Π° Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° ΡˆΡ‚ΠΎ Π³ΠΎ содрТи Ρ‚ΠΈΠΏΠΎΡ‚ Π½Π° Ρ‚ΠΎΠΊΠ΅Π½ ΠΈ самиот Ρ‚ΠΎΠΊΠ΅Π½ Π·Π° пристап. Π’ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ², Ρ‚ΠΈΠΏΠΎΡ‚ Π½Π° Ρ‚ΠΎΠΊΠ΅Π½ Π΅ сСкогаш носитСл. Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌΠ΅ Π΄Π°Π»ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΡ‚ Π½Π΅ Π΅ истСчСн ΠΈ Π΄Π° Π³ΠΎ Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΠΌΠ΅ ΠΏΠΎ Π΅Π΄Π΅Π½ час ΠΎΠ΄ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΡ‚ Π½Π° издавањС, Π½Π°Π²Π΅Π΄ΠΎΠ² Π±Π°Ρ€Π°ΡšΠ΅ Π·Π° Π΄Ρ€ΡƒΠ³Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° ΡˆΡ‚ΠΎ Π²Ρ€Π°ΡœΠ° Ρ‚ΠΎΠΊΠ΅Π½ Π·Π° 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
}

Π‘Π°Ρ€Π°ΡšΠ΅Ρ‚ΠΎ email:$query ќС ΠΏΠΎΠ±Π°Ρ€Π° ΠΎΠ΄ API Π΄Π° Π±Π°Ρ€Π° корисник со Ρ‚ΠΎΠΊΠΌΡƒ Ρ‚Π°Π° Π΅-ΠΏΠΎΡˆΡ‚Π°, Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°Ρ˜ΡœΠΈ псСвдоними. МоТС Π΄Π° користитС ΠΈ ΡŸΠΎΠΊΠ΅Ρ€: =, :, :{ΠŸΠ Π•Π€Π˜ΠšΠ‘}*.

Π—Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ΅Ρ‚Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, користСтС Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΡ‚ Π½Π° Π±Π°Ρ€Π°ΡšΠ΅ GET, Π·Π° Π²ΠΌΠ΅Ρ‚Π½ΡƒΠ²Π°ΡšΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ (создавањС смСтка ΠΈΠ»ΠΈ додавањС Ρ‡Π»Π΅Π½ Π²ΠΎ Π³Ρ€ΡƒΠΏΠ°) - ΠŸΠžΠ‘Π’ΠΠ’Π•Π’Π•, Π·Π° Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ΅ постоСчки ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ - PUT, Π·Π° Π±Ρ€ΠΈΡˆΠ΅ΡšΠ΅ запис (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Π»Π΅Π½ ΠΎΠ΄ Π³Ρ€ΡƒΠΏΠ°) - Π˜Π—Π‘Π Π˜Π¨Π˜.

Π‘ΠΊΡ€ΠΈΠΏΡ‚Π°Ρ‚Π° исто Ρ‚Π°ΠΊΠ° ќС Π±Π°Ρ€Π° тСлСфонски Π±Ρ€ΠΎΡ˜ (Π½Π΅ΠΏΠΎΡ‚Π²Ρ€Π΄Π΅Π½Π° Π½ΠΈΠ·Π°) ΠΈ Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°ΡšΠ΅ Π²ΠΎ Ρ€Π΅Π³ΠΈΠΎΠ½Π°Π»Π½Π° дистрибутивна Π³Ρ€ΡƒΠΏΠ°. Вој ΠΎΠ΄Π»ΡƒΡ‡ΡƒΠ²Π° која организациска Π΅Π΄ΠΈΠ½ΠΈΡ†Π° корисникот Ρ‚Ρ€Π΅Π±Π° Π΄Π° ја ΠΈΠΌΠ° Π²Ρ€Π· основа Π½Π° ΠΈΠ·Π±Ρ€Π°Π½ΠΈΠΎΡ‚ OU Π½Π° Active Directory ΠΈ Π΄ΠΎΠ°Ρ“Π° со Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°:

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
}

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ Π·Π° Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ΅ ΠΈ ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ смСтка ΠΈΠΌΠ°Π°Ρ‚ слична синтакса; Π½Π΅ сС ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ ситС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ полиња; Π²ΠΎ Π΄Π΅Π»ΠΎΡ‚ со тСлСфонски Π±Ρ€ΠΎΠ΅Π²ΠΈ, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π½Π°Π²Π΅Π΄Π΅Ρ‚Π΅ Π½ΠΈΠ·Π° ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° содрТи Π΄ΠΎ Π΅Π΄Π΅Π½ запис со Π±Ρ€ΠΎΡ˜ΠΎΡ‚ ΠΈ Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ‚ Ρ‚ΠΈΠΏ.

Π—Π° Π΄Π° Π½Π΅ Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅ Π³Ρ€Π΅ΡˆΠΊΠ° ΠΏΡ€ΠΈ додавањС Π½Π° корисник Π²ΠΎ Π³Ρ€ΡƒΠΏΠ°, ΠΏΡ€Π²ΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌΠ΅ Π΄Π°Π»ΠΈ Ρ‚ΠΎΡ˜ Π΅ вСќС Ρ‡Π»Π΅Π½ Π½Π° ΠΎΠ²Π°Π° Π³Ρ€ΡƒΠΏΠ° со добивањС листа Π½Π° Ρ‡Π»Π΅Π½ΠΎΠ²ΠΈ Π½Π° Π³Ρ€ΡƒΠΏΠ°Ρ‚Π° ΠΈΠ»ΠΈ состав ΠΎΠ΄ самиот корисник.

ΠŸΡ€Π°ΡˆΠ°ΡšΠ΅Ρ‚ΠΎ Π·Π° члСнството Π²ΠΎ Π³Ρ€ΡƒΠΏΠ°Ρ‚Π° Π½Π° ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ корисник Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π΅ Ρ€Π΅ΠΊΡƒΡ€Π·ΠΈΠ²Π½ΠΎ ΠΈ ќС ΠΏΡ€ΠΈΠΊΠ°ΠΆΡƒΠ²Π° само Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ члСнство. ЌС успСС Π΄Π° Π²ΠΊΠ»ΡƒΡ‡ΠΈΡ‚Π΅ корисник Π²ΠΎ родитСлска Π³Ρ€ΡƒΠΏΠ° која вСќС ΠΈΠΌΠ° дСтска Π³Ρ€ΡƒΠΏΠ° Π²ΠΎ која корисникот Π΅ Ρ‡Π»Π΅Π½.

Π—Π°ΠΊΠ»ΡƒΡ‡ΠΎΠΊ

ΠžΡΡ‚Π°Π½ΡƒΠ²Π° само Π΄Π° ΠΌΡƒ ја испрати Π½Π° корисникот Π»ΠΎΠ·ΠΈΠ½ΠΊΠ°Ρ‚Π° Π·Π° Π½ΠΎΠ²Π°Ρ‚Π° смСтка. Ова Π³ΠΎ ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ ΠΏΡ€Π΅ΠΊΡƒ БМБ ΠΈ ΠΈΡΠΏΡ€Π°ΡœΠ°ΠΌΠ΅ ΠΎΠΏΡˆΡ‚ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ со инструкции ΠΈ Π½Π°Ρ˜Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π»ΠΈΡ‡Π½Π° Π΅-ΠΏΠΎΡˆΡ‚Π°, која Π·Π°Π΅Π΄Π½ΠΎ со тСлСфонскиот Π±Ρ€ΠΎΡ˜ Π΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄Π΅Π½Π° ΠΎΠ΄ ΠΎΠ΄Π΄Π΅Π»ΠΎΡ‚ Π·Π° Ρ€Π΅Π³Ρ€ΡƒΡ‚ΠΈΡ€Π°ΡšΠ΅. Како Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°ΡˆΡ‚Π΅Π΄ΠΈΡ‚Π΅ ΠΏΠ°Ρ€ΠΈ ΠΈ Π΄Π° ја испратитС Π²Π°ΡˆΠ°Ρ‚Π° Π»ΠΎΠ·ΠΈΠ½ΠΊΠ° Π½Π° Ρ‚Π°Π΅Π½ тСлСграмски Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€, ΡˆΡ‚ΠΎ исто Ρ‚Π°ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° сС смСта Π·Π° Π²Ρ‚ΠΎΡ€ Ρ„Π°ΠΊΡ‚ΠΎΡ€ (MacBooks ќС Π±ΠΈΠ΄Π΅ исклучок).

Π’ΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°Ρ€ΠΈΠΌΠ΅ ΡˆΡ‚ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π²Ρ‚Π΅ Π΄ΠΎ ΠΊΡ€Π°Ρ˜. ЌС ΠΌΠΈ Π±ΠΈΠ΄Π΅ Π΄Ρ€Π°Π³ΠΎ Π΄Π° Π²ΠΈΠ΄Π°ΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠ·ΠΈ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΡƒΠ²Π°ΡšΠ΅ Π½Π° стилот Π½Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ написи ΠΈ Π²ΠΈ посакувам Π΄Π° Ρ„Π°Ρ‚ΠΈΡ‚Π΅ ΠΏΠΎΠΌΠ°Π»ΠΊΡƒ Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΏΡ€ΠΈ ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ скрипти =)

Бписок Π½Π° врски ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ тСматски корисни ΠΈΠ»ΠΈ Сдноставно Π΄Π° ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€Π°Ρ‚ Π½Π° ΠΏΡ€Π°ΡˆΠ°ΡšΠ°:

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€