рд╣рд╛рдп!
рдпрд╣ рдЖрд▓реЗрдЦ G Suite рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Google API рдХреЗ рд╕рд╛рде PowerShell рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдЧрд╛ред
рд╣рдо рдкреВрд░реЗ рд╕рдВрдЧрдарди рдореЗрдВ рдХрдИ рдЖрдВрддрд░рд┐рдХ рдФрд░ рдХреНрд▓рд╛рдЙрдб рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдЙрдирдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг Google рдпрд╛ рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдкрд╛рд╕ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмреАрдЪ рд╣рдо рдПрдХ рдкреНрд░рддрд┐рдХреГрддрд┐ рдмрдирд╛рдП рдирд╣реАрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ; рддрджрдиреБрд╕рд╛рд░, рдЬрдм рдХреЛрдИ рдирдпрд╛ рдХрд░реНрдордЪрд╛рд░реА рдирд┐рдХрд▓рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрди рджреЛрдиреЛрдВ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдЦрд╛рддрд╛ рдмрдирд╛рдиреЗ/рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЬреЛ рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рджреЛрдиреЛрдВ рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рднреЗрдЬрддреА рд╣реИред
рдкреНрд░рд╛рдзрд┐рдХрд░рдг
рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╕рдордп, рд╣рдордиреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирд╡ рдкреНрд░рд╢рд╛рд╕рдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛; рдпрд╣ рдЖрдХрд╕реНрдорд┐рдХ рдпрд╛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред
Google API рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдФрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП OAuth 2.0 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
рдореИрдВрдиреЗ рд╡рд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪреБрдиреА рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрд╕реНрдХрдЯреЙрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рднреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╕реНрд╡реАрд░ Google рдкреГрд╖реНрда рд╕реЗ рдЪрдпрдирд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛ рдПрдХ рдпреЛрдЬрдирд╛рдмрджреНрдз рд╡рд┐рд╡рд░рдг рд╣реИред
- рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо GET рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реБрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ Google рдЦрд╛рддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреГрд╖реНрда рдкрд░ рднреЗрдЬрддреЗ рд╣реИрдВ:
- рдЖрд╡реЗрджрди рдкрд╣рдЪрд╛рди рдкрддреНрд░
- рд╡реЗ рдХреНрд╖реЗрддреНрд░ рдЬрд╣рд╛рдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
- рд╡рд╣ рдкрддрд╛ рдЬрд┐рд╕ рдкрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреБрдирдГ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
- рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдЯреЛрдХрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗ
- рд╕реБрд░рдХреНрд╖рд╛ рдХреЛрдб
- рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдкреНрд░рд╛рд░реВрдк
- рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ GET рдорд╛рдкрджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдПрдХ рддреНрд░реБрдЯрд┐ рдпрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛрдб рдХреЗ рд╕рд╛рде, рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреГрд╖реНрда рдкрд░ рдкреБрдирдГ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
- рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдХреЛ рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░, рдпрджрд┐ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИ, рддреЛ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ
- рдпрджрд┐ рдЕрдиреБрд░реЛрдз рд╕рд╣реА рд╣реИ, рддреЛ Google API рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
- рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
- рдЗрд╕ рдЯреЛрдХрди рдХреА рд╡реИрдзрддрд╛ рдЕрд╡рдзрд┐
- рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдХреЛ рд░реАрдлреНрд░реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реАрдлреНрд░реЗрд╢ рдЯреЛрдХрди рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ Google API рдХрдВрд╕реЛрд▓ рдкрд░ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛:
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдкрдврд╝рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкрд╣рд▓реЗ рдЪрд░рдгреЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕реЗрд╕ рдФрд░ рд░реАрдлреНрд░реЗрд╢ рдЯреЛрдХрди рд▓реМрдЯрд╛рдПрдЧрд╛:
$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 рд╕реБрдирдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдХрд╛рд░реНрдп рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рд░реНрд╡рд░ рдкрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рдЗрдВрдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрдИ рдкреНрд░рд╢рд╛рд╕рдХ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдкреЛрд░реНрдЯ рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреЛрд░реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдПрдкреАрдЖрдИ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
access_type=рдСрдлрд╝рд▓рд╛рдЗрди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЕрдкрдиреЗ рдЖрдк рд╕рдорд╛рдкреНрдд рд╣реЛ рдЪреБрдХреЗ рдЯреЛрдХрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ,
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛_рдкреНрд░рдХрд╛рд░ = рдХреЛрдб рдХреЛрдб рдХреИрд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЗрд╕рдХрд╛ рдкреНрд░рд╛рд░реВрдк рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдкреБрд░рд╛рдиреА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкрджреНрдзрддрд┐ рдХрд╛ рд╕рдВрджрд░реНрдн, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдХреЛрдб рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдерд╛),
рдХреНрд╖реЗрддреНрд░ рдкрд╣реБрдВрдЪ рдХреЗ рджрд╛рдпрд░реЗ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдпрд╛ %20 (рдпреВрдЖрд░рдПрд▓ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рдЕрдиреБрд╕рд╛рд░) рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рдХрд╛рд░реЛрдВ рд╕рд╣рд┐рдд рдкрд╣реБрдВрдЪ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдпрд╣рд╛рдВ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдПрдХ рдмрдВрдж рд╕рдВрджреЗрд╢ рд▓реМрдЯрд╛рдПрдЧрд╛, рдкреЛрд░реНрдЯ рдкрд░ рд╕реБрдирдирд╛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ POST рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдЧрд╛ред рд╣рдо рдЗрд╕рдореЗрдВ рдХрдВрд╕реЛрд▓ рдПрдкреАрдЖрдИ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрдИрдбреА рдФрд░ рд░рд╣рд╕реНрдп, рд╡рд╣ рдкрддрд╛ рдЬрд┐рд╕ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдиреБрджрд╛рди_рдкреНрд░рдХрд╛рд░ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдЬрд╡рд╛рдм рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди, рд╕реЗрдХрдВрдб рдореЗрдВ рдЗрд╕рдХреА рд╡реИрдзрддрд╛ рдЕрд╡рдзрд┐ рдФрд░ рдПрдХ рд░рд┐рдлреНрд░реЗрд╢ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓рдВрдмреА рд╢реЗрд▓реНрдл рд▓рд╛рдЗрдл рдХреЗ рд╕рд╛рде рдЯреЛрдХрди рдХреЛ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реНрдерд╛рди рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЬрдм рддрдХ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдкрд╣реБрдВрдЪ рдХреЛ рд░рджреНрдж рдирд╣реАрдВ рдХрд░рддреЗ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддрд╛рдЬрд╝рд╛ рдЯреЛрдХрди рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЕрдВрдд рдореЗрдВ, рдореИрдВрдиреЗ рдЯреЛрдХрди рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдЬреЛрдбрд╝рд╛; рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рдФрд░ рддрд╛рдЬрд╝рд╛ рдЯреЛрдХрди рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛, рддреЛ рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧреА (рд╣рдордиреЗ рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЯреЛрдХрди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдорд╛рдирд╛, рдФрд░ рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ) 'рдореИрдВ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд╕рд╛рде рдЪреАрдЬреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдпрд╛ рдмрд╛рд░-рдмрд╛рд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЦреЛрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛)ред
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
}
рдИрдореЗрд▓:$рдХреНрд╡реЗрд░реА рдЕрдиреБрд░реЛрдз рдПрдкреАрдЖрдИ рдХреЛ рдЙрдкрдирд╛рдо рд╕рд╣рд┐рдд рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рдИрдореЗрд▓ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдЧрд╛ред рдЖрдк рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: =, :, :{рдЙрдкрд╕рд░реНрдЧ}*.
рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, GET рдЕрдиреБрд░реЛрдз рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдбреЗрдЯрд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЦрд╛рддрд╛ рдмрдирд╛рдирд╛ рдпрд╛ рдХрд┐рд╕реА рд╕рдореВрд╣ рдореЗрдВ рд╕рджрд╕реНрдп рдЬреЛрдбрд╝рдирд╛) - POST, рдореМрдЬреВрджрд╛ рдбреЗрдЯрд╛ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - PUT, рдХрд┐рд╕реА рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рд╕рдореВрд╣ рд╕реЗ рдХреЛрдИ рд╕рджрд╕реНрдп) - рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдорд┐рдЯрд╛рдирд╛ред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдлрд╝реЛрди рдирдВрдмрд░ (рдПрдХ рдЕрдорд╛рдиреНрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдФрд░ рдХреНрд╖реЗрддреНрд░реАрдп рд╡рд┐рддрд░рдг рд╕рдореВрд╣ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдкреВрдЫреЗрдЧреАред рдпрд╣ рдЪрдпрдирд┐рдд рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдУрдпреВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдХреМрди рд╕реА рд╕рдВрдЧрдардирд╛рддреНрдордХ рдЗрдХрд╛рдИ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдХ рдкрд╛рд╕рд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ:
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
}
рдЦрд╛рддрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдФрд░ рдмрдирд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛрддрд╛ рд╣реИ; рд╕рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ; рдлрд╝реЛрди рдирдВрдмрд░ рд╡рд╛рд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рд╕рд░рдгреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЙрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд░рд┐рдХреЙрд░реНрдб рддрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕рдореВрд╣ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдХреЛрдИ рддреНрд░реБрдЯрд┐ рди рд╣реЛ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд╕рдореВрд╣ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдпрд╛ рд░рдЪрдирд╛ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рдпрд╣ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕рдореВрд╣ рдХрд╛ рд╕рджрд╕реНрдп рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рдореВрд╣ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрддрд╛рдЫ рдХрд░рдирд╛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдХреЗрд╡рд▓ рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рджрд╕реНрдпрддрд╛ рджрд┐рдЦрд╛рдПрдЧрд╛ред рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдРрд╕реЗ рдореВрд▓ рд╕рдореВрд╣ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЪрд╛рдЗрд▓реНрдб рд╕рдореВрд╣ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рджрд╕реНрдп рд╣реИ, рд╕рдлрд▓ рд╣реЛрдЧрд╛ред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЬреЛ рдХреБрдЫ рдмрдЪрд╛ рд╣реИ рд╡рд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирдП рдЦрд╛рддреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд╡рд░реНрдб рднреЗрдЬрдирд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдПрд╕рдПрдордПрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдИрдореЗрд▓ рдкрд░ рд▓реЙрдЧрд┐рди рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдлреЛрди рдирдВрдмрд░ рдХреЗ рд╕рд╛рде, рднрд░реНрддреА рд╡рд┐рднрд╛рдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рдкреИрд╕реЗ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдирд╛ рдкрд╛рд╕рд╡рд░реНрдб рдЧреБрдкреНрдд рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреИрдЯ рдкрд░ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рджреВрд╕рд░рд╛ рдХрд╛рд░рдХ рднреА рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдореИрдХрдмреБрдХ рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реЛрдЧрд╛)ред
рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж. рдореБрдЭреЗ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреА рд╢реИрд▓реА рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡ рджреЗрдЦрдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреА рдФрд░ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрддреЗ рд╕рдордп рдЖрдкрдХреЛ рдХрдо рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкрдХрдбрд╝реЗрдВ =)
рдЙрди рд▓рд┐рдВрдХреЛрдВ рдХреА рд╕реВрдЪреА рдЬреЛ рд╡рд┐рд╖рдпрдЧрдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХреЗрд╡рд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ:
рдореЛрдмрд╛рдЗрд▓ рдФрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рдРрдкреНрд╕ рдХреЗ рд▓рд┐рдП OAuth 2.0 рд╡реЗрдм рд╕рд░реНрд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП OAuth 2.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ OAuth рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЧреНрд░рд╛рд╣рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХреЛрдб рд╡рд┐рдирд┐рдордп рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдг рдХреБрдВрдЬреА рдкреЙрд╡рд░рд╢реЗрд▓ рдХреЗ рд╕рд╛рде рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрддреНрд░ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ ASCII рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рд╡рд┐рд╡рд░рдг рдкреЙрд╡рд░рд╢реЗрд▓: рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣реИрд╢ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмреЗрд╕64рдпреВрдЖрд░рдПрд▓ рдХреЛ рдПрдирдХреЛрдб/рдбреАрдХреЛрдб рдХрд░реЗрдВ рдмреЗрд╕64 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдмрдирд╛рдо рдмреЗрд╕64рдпреВрдЖрд░рдПрд▓ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкреЙрд╡рд░рд╢реЗрд▓ 5.1 рдореЗрдВ рдЗрдирд╡реЛрдХ-рд░реЗрд╕реНрдЯрдореЗрдереЛрдб рдЪрд░рдг 1 рдореЗрдВ access_type рдСрдлрд╝рд▓рд╛рдЗрди рд╣реЛрдиреЗ рдкрд░ рднреА рддрд╛рдЬрд╝рд╛ рдЯреЛрдХрди рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдПрдкреАрдЖрдИ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦрд╛рддреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЦреЛрдЬреЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдПрдкреАрдЖрдИ: рд╕рдореВрд╣ рдЗрдирд╡реЛрдХ-рд░реЗрд╕реНрдЯрдореЗрдердб рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди - рдкрд╛рд╡рд░рд╢реЗрд▓
рд╕реНрд░реЛрдд: www.habr.com