API வழியாக PowerShell இலிருந்து Google பயனர்களை உருவாக்குதல்

வாழ்த்துக்கள்!

G Suite பயனர்களைக் கையாள, Google API உடன் PowerShell தொடர்புகளை செயல்படுத்துவதை இந்தக் கட்டுரை விவரிக்கும்.

நிறுவனம் முழுவதும் பல உள் மற்றும் கிளவுட் சேவைகளைப் பயன்படுத்துகிறோம். பெரும்பாலும், அவற்றில் உள்ள அங்கீகாரம் கூகுள் அல்லது ஆக்டிவ் டைரக்டரிக்கு வருகிறது, அதற்கு இடையில் எங்களால் பிரதியை பராமரிக்க முடியாது; அதன்படி, ஒரு புதிய ஊழியர் வெளியேறும்போது, ​​இந்த இரண்டு அமைப்புகளிலும் நீங்கள் கணக்கை உருவாக்க வேண்டும்/இயக்க வேண்டும். செயல்முறையை தானியக்கமாக்க, தகவலைச் சேகரித்து இரண்டு சேவைகளுக்கும் அனுப்பும் ஸ்கிரிப்டை எழுத முடிவு செய்தோம்.

அங்கீகாரம்

தேவைகளை வரையும்போது, ​​அங்கீகாரத்திற்காக உண்மையான மனித நிர்வாகிகளைப் பயன்படுத்த முடிவு செய்தோம்; இது தற்செயலான அல்லது வேண்டுமென்றே பாரிய மாற்றங்கள் ஏற்பட்டால் செயல்களின் பகுப்பாய்வை எளிதாக்குகிறது.

அங்கீகாரம் மற்றும் அங்கீகாரத்திற்காக Google APIகள் OAuth 2.0 நெறிமுறையைப் பயன்படுத்துகின்றன. பயன்பாட்டு வழக்குகள் மற்றும் விரிவான விளக்கங்களை இங்கே காணலாம்: Google APIகளை அணுக OAuth 2.0 ஐப் பயன்படுத்துதல்.

டெஸ்க்டாப் பயன்பாடுகளில் அங்கீகாரத்திற்காகப் பயன்படுத்தப்படும் ஸ்கிரிப்டைத் தேர்ந்தெடுத்தேன். சேவைக் கணக்கைப் பயன்படுத்துவதற்கான விருப்பமும் உள்ளது, இது பயனரிடமிருந்து தேவையற்ற இயக்கங்கள் தேவையில்லை.

கீழே உள்ள படம், கூகுள் பக்கத்திலிருந்து தேர்ந்தெடுக்கப்பட்ட காட்சியின் திட்ட விளக்கமாகும்.

API வழியாக PowerShell இலிருந்து Google பயனர்களை உருவாக்குதல்

  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 ஐக் கேட்கத் தொடங்க வேண்டும், அது திருப்பி அனுப்பப்படும்.

நிர்வாகப் பணிகள் ஒரு சிறப்பு சேவையகத்தில் செய்யப்படுகின்றன, ஒரே நேரத்தில் பல நிர்வாகிகள் ஸ்கிரிப்டை இயக்கும் வாய்ப்பை நாங்கள் நிராகரிக்க முடியாது, எனவே இது தற்போதைய பயனருக்காக தோராயமாக ஒரு போர்ட்டைத் தேர்ந்தெடுக்கும், ஆனால் நான் முன் வரையறுக்கப்பட்ட போர்ட்களைக் குறிப்பிட்டேன். ஏபிஐ கன்சோலில் நம்பகமானவையாக அவை சேர்க்கப்பட வேண்டும்.

access_type=ஆஃப்லைன் உலாவியுடன் பயனர் தொடர்பு இல்லாமல் பயன்பாடு காலாவதியான டோக்கனைத் தானாகவே புதுப்பிக்க முடியும்,
பதில்_வகை=குறியீடு குறியீடு எவ்வாறு திரும்பப் பெறப்படும் என்பதற்கான வடிவமைப்பை அமைக்கிறது (பழைய அங்கீகார முறையின் குறிப்பு, உலாவியில் இருந்து குறியீட்டை ஸ்கிரிப்ட்டில் பயனர் நகலெடுத்தபோது),
நோக்கம் அணுகலின் நோக்கம் மற்றும் வகையைக் குறிக்கிறது. அவை இடைவெளிகள் அல்லது %20 (URL குறியாக்கத்தின் படி) மூலம் பிரிக்கப்பட வேண்டும். வகைகளுடன் அணுகல் பகுதிகளின் பட்டியலை இங்கே காணலாம்: Google APIகளுக்கான OAuth 2.0 ஸ்கோப்கள்.

அங்கீகாரக் குறியீட்டைப் பெற்ற பிறகு, பயன்பாடு உலாவிக்கு நெருக்கமான செய்தியைத் திருப்பி, போர்ட்டில் கேட்பதை நிறுத்தி, டோக்கனைப் பெற POST கோரிக்கையை அனுப்பும். கன்சோல் API இலிருந்து முன்னர் குறிப்பிடப்பட்ட ஐடி மற்றும் ரகசியம், பயனர் திசைதிருப்பப்படும் முகவரி மற்றும் நெறிமுறை விவரக்குறிப்புக்கு ஏற்ப Grand_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'])
      }
    }
  }
}

ஒவ்வொரு கோரிக்கையிலும், டோக்கன் வகை மற்றும் அணுகல் டோக்கன் அடங்கிய அங்கீகாரத் தலைப்பை நீங்கள் அனுப்ப வேண்டும். தற்போது, ​​டோக்கன் வகை எப்போதும் தாங்கியாக உள்ளது. ஏனெனில் டோக்கன் காலாவதியாகவில்லை என்பதைச் சரிபார்த்து, அது வழங்கப்பட்ட தருணத்திலிருந்து ஒரு மணிநேரத்திற்குப் பிறகு அதைப் புதுப்பிக்க வேண்டும், அணுகல் டோக்கனை வழங்கும் மற்றொரு செயல்பாட்டிற்கான கோரிக்கையை நான் குறிப்பிட்டேன். முதல் அணுகல் டோக்கனைப் பெறும்போது அதே குறியீடு ஸ்கிரிப்ட்டின் தொடக்கத்தில் உள்ளது:

function Get-GoogleToken {
  if (((Get-date).Hour -gt $token_expire.hour) -or (((Get-date).Hour -ge $token_expire.hour) -and ((Get-date).Minute -gt $token_expire.minute))) {
  Write-Host "Token Expired. Refreshing..."
    $request = (Invoke-RestMethod -Method Post -Uri "https://www.googleapis.com/oauth2/v4/token" -ContentType 'application/x-www-form-urlencoded' -Body @{
      client_id = $client_id
      client_secret = $client_secret
      refresh_token = $refresh_token
      grant_type = 'refresh_token'
    })
    $token = $request.access_token
    $minute = ([int]("{0:mm}" -f ([timespan]::fromseconds($request.expires_in))))+((Get-date).Minute)-2
    if ($minute -lt 0) {$minute += 60}
    elseif ($minute -gt 59) {$minute -=60}
    $script:token_expire = @{
      hour = ([int]("{0:hh}" -f ([timespan]::fromseconds($request.expires_in))))+((Get-date).Hour)
      minute = $minute
    }
  }
  return $token
}

இருப்புக்கான உள்நுழைவைச் சரிபார்க்கிறது:

function Check_Google {
  $query = (GoogleQuery 'SearchAccount' $username)
  if ($query.users -ne $null) {
    $user = $query.users[0]
    Write-Host $user.name.fullName' - '$user.PrimaryEmail' - suspended: '$user.Suspended
    $GAresult = $user
  }
  if ($GAresult) {
      $return = $GAresult
  } else {$return = 'gg'}
  return $return
}

மின்னஞ்சல்:$query கோரிக்கையானது, மாற்றுப்பெயர்கள் உட்பட, அந்த மின்னஞ்சலைக் கொண்ட பயனரைத் தேடுமாறு APIயிடம் கேட்கும். நீங்கள் வைல்டு கார்டையும் பயன்படுத்தலாம்: =, :, :{PREFIX}*.

தரவைப் பெற, GET கோரிக்கை முறையைப் பயன்படுத்தவும், தரவைச் செருகவும் (ஒரு கணக்கை உருவாக்குதல் அல்லது ஒரு குழுவில் உறுப்பினரைச் சேர்ப்பது) - POST, ஏற்கனவே உள்ள தரவைப் புதுப்பிக்க - PUT, ஒரு பதிவை நீக்க (எடுத்துக்காட்டாக, ஒரு குழுவிலிருந்து ஒரு உறுப்பினர்) - அழி.

ஸ்கிரிப்ட் தொலைபேசி எண்ணையும் (சரிபார்க்கப்படாத சரம்) மற்றும் பிராந்திய விநியோகக் குழுவில் சேர்க்கும்படி கேட்கும். தேர்ந்தெடுக்கப்பட்ட ஆக்டிவ் டைரக்டரி 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
}

கணக்கைப் புதுப்பிப்பதற்கும் உருவாக்குவதற்கும் ஒரே மாதிரியான தொடரியல் உள்ளது; அனைத்து கூடுதல் புலங்களும் தேவையில்லை; ஃபோன் எண்கள் உள்ள பிரிவில், எண் மற்றும் அதன் வகையுடன் ஒரு பதிவைக் கொண்டிருக்கும் ஒரு வரிசையை நீங்கள் குறிப்பிட வேண்டும்.

ஒரு குழுவில் ஒரு பயனரைச் சேர்க்கும்போது பிழை ஏற்படாமல் இருக்க, குழு உறுப்பினர்களின் பட்டியலைப் பயனரிடமிருந்து பெறுவதன் மூலம் அவர் ஏற்கனவே இந்தக் குழுவில் உறுப்பினராக உள்ளாரா என்பதை முதலில் சரிபார்க்கலாம்.

ஒரு குறிப்பிட்ட பயனரின் குழு உறுப்பினரை வினவுவது சுழல்நிலையாக இருக்காது மற்றும் நேரடி உறுப்பினரை மட்டுமே காண்பிக்கும். ஏற்கனவே குழந்தைக் குழுவைக் கொண்டுள்ள பெற்றோர் குழுவில் ஒரு பயனரைச் சேர்த்துக் கொள்வது வெற்றி பெறும்.

முடிவுக்கு

புதிய கணக்கிற்கான கடவுச்சொல்லை பயனருக்கு அனுப்புவது மட்டுமே மீதமுள்ளது. நாங்கள் இதை எஸ்எம்எஸ் மூலம் செய்கிறோம், மேலும் அறிவுறுத்தல்களுடன் பொதுவான தகவலை அனுப்புகிறோம் மற்றும் தனிப்பட்ட மின்னஞ்சலுக்கு உள்நுழைகிறோம், இது ஒரு தொலைபேசி எண்ணுடன், ஆட்சேர்ப்புத் துறையால் வழங்கப்பட்டது. மாற்றாக, நீங்கள் பணத்தைச் சேமிக்கலாம் மற்றும் உங்கள் கடவுச்சொல்லை ரகசிய தந்தி அரட்டைக்கு அனுப்பலாம், இது இரண்டாவது காரணியாகக் கருதப்படலாம் (மேக்புக்ஸ் விதிவிலக்காக இருக்கும்).

இறுதிவரை படித்ததற்கு நன்றி. கட்டுரைகள் எழுதும் பாணியை மேம்படுத்துவதற்கான பரிந்துரைகளைக் கண்டு நான் மகிழ்ச்சியடைவேன் மற்றும் ஸ்கிரிப்ட்களை எழுதும் போது நீங்கள் குறைவான பிழைகளைப் பிடிக்க விரும்புகிறேன் =)

கருப்பொருள் ரீதியாக பயனுள்ளதாக இருக்கும் அல்லது கேள்விகளுக்கு எளிமையாக பதிலளிக்கக்கூடிய இணைப்புகளின் பட்டியல்:

ஆதாரம்: www.habr.com

கருத்தைச் சேர்