Hello!
Mìnichidh an t-artaigil seo mar a chuireas tu an gnìomh eadar-obrachadh PowerShell leis an Google API gus luchd-cleachdaidh G Suite a làimhseachadh.
Bidh sinn a’ cleachdadh grunn sheirbheisean a-staigh agus seirbheisean sgòthan aig a’ bhuidheann againn. Sa mhòr-chuid, tha dearbhadh cuingealaichte ri Google no Active Directory, agus chan urrainn dhuinn leth-bhreac a chumail eatorra. Mar sin, nuair a thig neach-obrach ùr a-steach, feumaidh sinn cunntas a chruthachadh agus a chomasachadh anns an dà shiostam. Gus am pròiseas seo a dhèanamh fèin-ghluasadach, chuir sinn romhainn sgriobt a sgrìobhadh a chruinnicheas fiosrachadh agus a chuireas e chun an dà sheirbheis.
Ùghdarrachadh
Nuair a bha sinn a’ dreachdadh nan riatanasan, cho-dhùin sinn rianairean daonna fìor a chleachdadh airson ùghdarrachadh; tha seo a’ sìmpleachadh mion-sgrùdadh ghnìomhan rè atharrachaidhean mòra gun fhiosta no a dh’aona ghnothach.
Bidh APIan Google a’ cleachdadh pròtacal OAuth 2.0 airson dearbhadh agus ùghdarrachadh. Gheibhear suidheachaidhean cleachdaidh agus tuairisgeul nas mionaidiche an seo: .
Thagh mi an suidheachadh a thathar a’ cleachdadh airson ùghdarrachadh ann an aplacaidean deasg. Tha an roghainn ann cuideachd cunntas seirbheis a chleachdadh, nach eil ag iarraidh ceumannan a bharrachd bhon neach-cleachdaidh.
Tha an ìomhaigh gu h-ìosal na thuairisgeul sgemataig den t-suidheachadh taghte bhon duilleag Google.

- An toiseach, cuiridh sinn an neach-cleachdaidh gu duilleag dearbhaidh cunntas Google, a’ sònrachadh nam paramadairean GET:
- ID an tagraidh
- raointean ris am feum an aplacaid ruigsinneachd fhaighinn
- an seòladh dhan tèid an neach-cleachdaidh ath-stiùireadh às dèidh crìoch a chur air a’ phròiseas
- mar a nì sinn ùrachadh air an tòcan
- còd dearbhaidh
- cruth tar-chuir còd dearbhaidh
- Às dèidh ùghdarrachadh a chrìochnachadh, thèid an neach-cleachdaidh ath-stiùireadh chun na duilleige a chaidh a shònrachadh anns a’ chiad iarrtas, le còd mearachd no ùghdarrais air a chur seachad ann am paramadairean GET.
- Feumaidh an aplacaid (sgriobt) na paramadairean seo fhaighinn agus, ma gheibhear an còd, an ath iarrtas a dhèanamh gus comharran fhaighinn.
- Ma tha an t-iarrtas ceart, tillidh API Google:
- Comharra ruigsinneachd leis an urrainn dhuinn iarrtasan a dhèanamh
- Ceann-latha crìochnachaidh an tòcan seo
- Feumar comharra ùrachaidh gus an comharra ruigsinneachd ùrachadh.
An toiseach, feumaidh tu a dhol gu consol API Google: , tagh an aplacaid a tha thu ag iarraidh, agus cruthaich comharraiche teachdaiche OAuth san earrann Teisteanasan. An sin (no nas fhaide air adhart, ann an feartan an comharraiche a chaidh a chruthachadh), feumaidh tu na seòlaidhean a shònrachadh a tha ceadaichte ath-stiùireadh thuca. Nar cùis-ne, bidh seo na grunn inntrigidhean localhost le diofar phuirt (faic gu h-ìosal).
Gus algairim an sgriobta a dhèanamh nas fhasa a leughadh, faodaidh tu na ciad cheumannan a thoirt a-mach gu gnìomh air leth a bheir air ais comharran Ruigsinneachd is Ùrachadh airson an aplacaid:
$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
Shuidhich sinn an ID Cliant agus an Dìomhaireachd Cliant a fhuaireadh bho fheartan ID cliant OAuth, agus is e sreang eadar 43 agus 128 caractar a th’ anns an dearbhaiche còd a bu chòir a chruthachadh air thuaiream bho charactaran gun ghlèidheadh: [A-Z] / [a-z] / [0-9] / "-" / "." / "_" / "~".
Thèid an còd seo ath-chraoladh an uairsin. Tha seo a’ cur às don t-so-leòntachd far am faodadh ionnsaighear an fhreagairt a thilleas ath-sheòladh às deidh don neach-cleachdaidh logadh a-steach a ghlacadh.
’S urrainn dhut an dearbhaiche còd san iarrtas làithreach a chur ann an teacsa soilleir (a tha ga dhèanamh gun chiall - chan eil seo freagarrach ach airson siostaman nach eil a’ toirt taic do SHA256), no le bhith a’ cruthachadh hash a’ cleachdadh an algairim SHA256, a dh’ fheumar a chòdachadh ann am BASE64Url (eadar-dhealaichte bho Base64 le dà shamhla clàir) agus an caractar crìochnachaidh loidhne a thoirt air falbh: =.
An ath rud, feumaidh sinn tòiseachadh air èisteachd ri http air an inneal ionadail gus am freagairt fhaighinn às dèidh ùghdarrachadh, a thèid a thilleadh le ath-sheòladh.
Bithear a’ dèanamh ghnìomhan rianachd air frithealaiche sònraichte, agus chan urrainn dhuinn a dhiùltadh gum faodadh grunn rianairean an sgriobt a ruith aig an aon àm. Mar sin, taghaidh e port air thuaiream airson an neach-cleachdaidh làithreach. Ach, tha mi air puirt ro-mhìnichte a shònrachadh oir feumar an cur ris mar phuirt earbsach ann an consol an API cuideachd.
seòrsa_ruigsinneachd=far-loidhne a’ ciallachadh gun urrainn don aplacaid comharra a tha air tighinn gu crìch ùrachadh leis fhèin gun eadar-obrachadh an neach-cleachdaidh leis a’ bhrobhsair,
seòrsa_freagairt=còd a’ sònrachadh cruth mar a thèid an còd a thilleadh (iomradh air an t-seann dhòigh ùghdarrachaidh, nuair a rinn an neach-cleachdaidh lethbhreac is pasgadh den chòd bhon bhrabhsair a-steach don sgriobt),
farsaingeachd A’ sònrachadh nan raointean agus nan seòrsaichean ruigsinneachd. Feumaidh iad a bhith air an sgaradh le beàrnan no %20 (a rèir Còdachadh URL). Gheibhear liosta de raointean agus seòrsaichean ruigsinneachd an seo: .
Às dèidh dhuinn an còd ùghdarrachaidh fhaighinn, bidh an aplacaid a’ tilleadh teachdaireachd dùnaidh chun bhrobhsair, a’ stad ag èisteachd air a’ phort, agus a’ cur iarrtas POST gus comharra fhaighinn. Bidh sinn a’ sònrachadh an id agus an dìomhaireachd a chaidh a shònrachadh roimhe bhon chonsól API, an seòladh dhan tèid an neach-cleachdaidh ath-stiùireadh, agus an grant_type a rèir sònrachadh a’ phròtacail.
Mar fhreagairt, gheibh sinn comharra Ruigsinneachd, an ùine dligheachd aige ann an diogan, agus comharra Ùrachaidh, leis an urrainn dhuinn an comharra Ruigsinneachd ùrachadh.
Feumaidh an aplacaid comharran a stòradh ann an àite tèarainte le beatha sgeilp fhada, agus mar sin gus an cuir sinn às don chothrom a chaidh a thoirt seachad, cha gheibh an aplacaid comharra ùrachaidh. Aig a’ cheann thall, chuir mi iarrtas ris gus an comharra a chùl-ghairm; ma dh’fhailicheas an aplacaid agus mura tèid an comharra ùrachaidh a thilleadh, tòisichidh e air a’ phròiseas a-rithist (bha sinn den bheachd nach robh e sàbhailte comharran a stòradh gu h-ionadail air an teirminéal, agus cha robh sinn airson cùisean a dhèanamh nas iom-fhillte le crioptagrafaireachd no am brabhsair fhosgladh gu tric).
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
}
Mar a mhothaich thu mu thràth, thathar a’ cleachdadh Invoke-WebRequest gus comharra a chùl-ghairm. Eu-coltach ri Invoke-RestMethod, chan eil e a’ tilleadh an dàta a fhuaireadh ann an cruth a ghabhas cleachdadh agus a’ taisbeanadh inbhe an iarrtais.
An ath rud, iarraidh an sgriobt ort ciad ainm agus sloinneadh an neach-cleachdaidh a chuir a-steach, a’ gineadh logadh a-steach + post-d.
Iarrtasan
Is e na ceistean a leanas sgrùdadh a dhèanamh an toiseach a bheil neach-cleachdaidh leis an aon logadh a-steach ann mu thràth gus co-dhùnadh fhaighinn air fear ùr a chruthachadh no an tè a th’ ann an-dràsta a chomasachadh.
Cho-dhùin mi a h-uile ceist a chur an gnìomh ann an cruth aon ghnìomh le taghadh a’ cleachdadh suidse:
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'])
}
}
}
}Feumaidh gach iarrtas ceann-sgrìobhaidh Ùghdarrais a chur a-steach anns a bheil an seòrsa comharra agus an comharra Ruigsinneachd fhèin. An-dràsta, is e Bearer an seòrsa comharra an-còmhnaidh. Leis gu feum sinn dearbhadh nach eil an comharra air tighinn gu crìch agus ùrachadh às dèidh uair a thìde bhon àm a chaidh a thoirt seachad, shònraich mi an t-iarrtas gu gnìomh eile a thilleas an comharra Ruigsinneachd. Tha an aon phìos còd seo aig toiseach an sgriobt nuair a gheibhear a’ chiad chomharra Ruigsinneachd:
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
}A’ sgrùdadh a bheil logadh a-steach ann:
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
}Iarraidh an t-iarrtas email:$query air an API lorg neach-cleachdaidh leis an t-seòladh puist-d sònraichte sin, a’ gabhail a-steach far-ainmean. Faodaidh tu cuideachd wildcard a chleachdadh: =, :, :{RO-LEASACHAN}*.
Gus dàta fhaighinn air ais, cleachd an dòigh iarrtas GET, gus dàta a chuir a-steach (cunntas a chruthachadh no ball a chur ri buidheann) – POST, gus dàta a tha ann mar-thà ùrachadh – PUT, gus clàr a dhubhadh às (mar eisimpleir, ball bho bhuidheann) – DELETE.
Iarraidh an sgriobt àireamh fòn cuideachd (sreang neo-dhligheach) agus am bu chòir dhut a dhol a-steach do bhuidheann sgaoilidh roinneil. Co-dhùinidh e cuideachd aonad eagrachaidh an neach-cleachdaidh stèidhichte air an OU Active Directory a chaidh a thaghadh agus cruthaichidh e facal-faire:
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"
Agus an uairsin tòisichidh e air a’ chunntas a làimhseachadh:
$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 = 'moscowoffice@rocketguys.com'
email = $email
}
(GoogleQuery 'AddMember' $query) | fl
}
Tha co-chàradh coltach ri chèile aig na gnìomhan ùrachaidh is cruthachadh cunntais; chan eil feum air a h-uile raon a bharrachd. Anns an earrann àireamh fòn, feumaidh tu sreath a shònrachadh anns am faod co-dhiù aon inntrigeadh a bhith le àireamh agus a sheòrsa.
Gus mearachd a sheachnadh nuair a chuireas sinn neach-cleachdaidh ri buidheann, is urrainn dhuinn an toiseach sgrùdadh a dhèanamh a bheil an neach-cleachdaidh mar-thà na bhall den bhuidheann seo le bhith a’ faighinn liosta de bhuill na buidhne no an co-dhèanamh bhon neach-cleachdaidh fhèin.
Cha bhith ceisteachadh mu bhallrachd buidhne neach-cleachdaidh sònraichte ath-chuairteach agus cha seall e ach a’ bhallrachd sa bhad. Soirbhichidh le bhith a’ cur neach-cleachdaidh ri buidheann phàrant aig a bheil buidheann-chloinne mu thràth agus an neach-cleachdaidh na bhall dheth.
co-dhùnadh
Chan eil air fhàgail ach am facal-faire airson a’ chunntais ùir a chur chun neach-cleachdaidh. Bidh sinn a’ dèanamh seo tro SMS, agus a’ cur fiosrachadh coitcheann, a’ gabhail a-steach stiùireadh agus logadh a-steach, chun t-seòladh puist-d pearsanta a thug an roinn HR seachad, còmhla ris an àireamh fòn. Air neo, faodaidh tu airgead a shàbhaladh agus am facal-faire a chur tro chòmhradh dìomhair Telegram, rud a dh’ fhaodar a mheas mar dhàrna factar cuideachd (tha MacBooks mar eisgeachd).
Tapadh leibh airson a bhith a’ leughadh chun na crìche. Bu toil leam molaidhean a chluinntinn airson mo stoidhle sgrìobhaidh a leasachadh, agus tha mi an dòchas gun dèan sibh nas lugha de mhearachdan fhad ’s a tha sibh a’ sgrìobhadh sgriobtaichean =)
Liosta de cheanglaichean a dh’ fhaodadh a bhith feumail a thaobh cuspair no dìreach a’ freagairt cheistean sam bith a dh’ fhaodadh èirigh:
Source: www.habr.com
