混乱の解消を止め、PowerShellエンティティの作成を任せる方法







新しい従業員が仕事に行くとき、通常、Active Directoryにアカウントを作成するだけでは十分ではありません。セキュリティグループに彼を含め、ネットワークドライブ、メールボックスに個人フォルダーを作成し、ERP \ CRMシステムにアカウントを追加する必要があります...その後、 Active Directoryの属性適時に覚えて構成する必要があります







しかし、問題を解決するためのよりエレガントなオプションがあります。 アカウントを手動で作成するのにうんざりしている場合-catに招待します。







テンプレートとPowerShell



使い慣れた言語のスクリプトは、新しいアカウントに必要な「フォーム」を提供する単純な自動化としても機能します。 パラメーターとして、ユーザーおよび部門のデータを受け入れます。







基本的にこの方法に基づいて、より興味深い例を分析します。







このようなスクリプトは、事前に準備された「フロントエンド」ファイルが任意のテキスト形式(JSON、XML、またはCSV)で転送される「バックエンド」にすることができます。







たとえば、次のようにユーザーとユーザー用のフォルダーを作成するためのJSONファイルを準備できます。







{ "ActiveDirectory": { "UserAccounts": [ { "FirstName" : "", "LastName" : "", "Department": "", "UserName": "Iivanov" } ] }, "UserHomeFolders" : [ { "Name": "" } ] }
      
      





この例では、ファイルは特定の構造を持ち、一度に複数のユーザーの自動作成をサポートします。 次に、ファイルの内容を解析して特定のアクションを実行するスクリプトを作成する必要があります。 この例では、次のコマンドレットが適しています。







 [CmdletBinding()] param( [Parameter()] [ValidateNotNullOrEmpty()] [string]$TemplateFilePath = 'C:\temp\users.json' ) $users = Get-Content -Path $TemplateFilePath -Raw | ConvertFrom-Json $users.ActiveDirectory.UserAccounts | ForEach-Object { if ($adUser = Get-AdUser -Filter "samAccountName -eq '$($_.UserName)'") { $setParams = @{ Identity = $_.UserName } if ($adUser.GivenName -ne $_.FirstName) { $setParams.GivenName = $_.FirstName } if ($adUser.SurName -ne $_.LastName) { $setParams.SurName = $_.LastName } if (@($setParams.Keys).Count -gt 1) { $setParams Write-Verbose -Message "   [$($_.UserName)] " Set-AdUser @setParams } else { Write-Verbose -Message " [$($_.UserName)]  " } } else { Write-Verbose -Message "   [$($_.UserName)]..." New-AdUser -Name $_.UserName -GivenName $_.FirstName -SurName $_.LastName -Path "ou=$($_.Department),dc=domain,dc=com" } } $fileServerShare = 'C:\HomeFolders' $users.UserHomeFolders | ForEach-Object { $folderPath = Join-Path -Path $fileServerShare -ChildPath $_.Name if (-not (Test-Path -Path $folderPath -PathType Container)) { Write-Verbose -Message "  [$($folderPath)]..." $null = New-Item -Path $folderPath -Type Directory } else { Write-Verbose -Message " [$($folderPath)]  " } }
      
      





これで、結果のスクリプトを実行して、その作業を楽しむことができます。









コマンドレットの仕事。







このコマンドレットは一例であり、切断されたユーザーを作成し、セキュリティグループに含めないことに注意してください。 そして、フォルダへの権限を設定する必要があります。 インフラストラクチャのソリューションを自分で完成させることを提案します。

コマンドレットが5分ごとに1回スケジュールで実行されるように構成できる場合、JSONを生成するものを把握する必要があります。 単純なWebインターフェイス、同じPowerShell上のGUI、および他の1Cにすることができます。 Googleフォームをフロントとして使用し、同時にG Suiteのユーザー用のボックスを作成する興味深い例は、記事「 別の 自動化の例またはPowerShell + Google Appsスクリプト 」で検討されています。







生活を楽にする自動化の例をもう少し見ていきます。







フォルダーのアクセス許可を設定する



また、新しいユーザーごとの規制に従って、ユニットのサブフォルダー内のネットワークドライブにフォルダーが作成されました。 そして、毎回、フォルダやフォルダへのアクセスがないというリクエストがメールに送信されました。ロードされたエンジニアは、そのような些細なことを忘れてしまいました。







ネガティブを減らすために、PowerShellが登場する前に、vbsでスクリプトが開発されました。 1日1回、彼はADに接続し、そこから新たに作成されたユーザーを収集しました。 そして、彼は標準に従ってフォルダーを作成し、 xcacls.vbsを使用してこのコマンドで必要な権限を設定しました。







 WshShell.Run "cscript.exe C:\xcacls.vbs " + """" + folder + """" +" "+ "/I COPY /R users /G domain\"+ user+ ":F"
      
      





userは新しいユーザーの名前、folderは新しく作成されたフォルダーへのパス、domainはドメインです。







その後、ユーザーを作成するためのGUIを備えた洗練されたAutoITエンジンが既に開発されました。 彼は音訳規則に従ってアカウントの名前を作成し、1Cでユーザーを作成し、オフィスにアクセスするための近接カードを発行しました。 このメカニズムのフォルダー権限は、システムdll advapi32.dllおよびkernel32.dllを使用するPermissions.au3ライブラリを使用して設定されます。







必要な権限のスクリプトの一部:







 FileWriteLine($logfile, "  "&$path) local $aPermissions[2][3] $aPermissions[0][0]="domain\"& $username $aPermissions[0][1]=1 $aPermissions[0][2]=$GENERIC_ALL $aPermissions[1][0]="Users" $aPermissions[1][1]=1 $aPermissions[1][2]="" _EditObjectPermissions($path, $aPermissions,$SE_FILE_OBJECT,"",1) FileWriteLine($logfile, " ") _ClosePermissionResources()
      
      





PowerShellでは、同様の権利の付与は次のようになります。







 $acl = Get-Acl $path $acl.SetAccessRuleProtection($true,$true) $acl.Access |where {$_.IdentityReference -eq "Domain\Users"} | %{$acl.RemoveAccessRule($_)} $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule ($username,"FullControl","ContainerInherit,ObjectInherit","None","Allow") $acl | Set-Acl $path
      
      





おそらく、ACL管理はほんの少しであり、PowerShellで簡単に実装されるわけではありません。 PowerShellが強力でシンプルな場所に移りましょう。







メールと電話を追加する



Exchangeをメールサーバーとしてインストールしている場合、 New-Mailboxコマンドレットを使用すると、 メールボックスでユーザーをすぐに作成できます。 初期スクリプトでユーザーを作成するには、次のコマンドを使用できます。







 New-Mailbox -UserPrincipalName $_.UserName@example.com -Alias $_.UserName -Database "Mailbox" -Name $_.UserName –OrganizationalUnit CorpUsers -Password $password -FirstName $_.FirstName -LastName $_.LastName -DisplayName "$($_.FirstName) $($_.LastName)" -ResetPasswordOnNextLogon $Right
      
      





同じことがMS Lyncにも当てはまります。







 Enable-CsUser -Identity "$($_.UserName)@domain.ru" -RegistrarPool "lync.domain.ru" -SipAddress "sip:$($_.UserName)@domain.ru"
      
      





他のソリューション(たとえば、メール用のPostfixやテレフォニー用のアスタリスク)を使用する場合、SSHを介してWindowsシステムから* nixサーバーに接続する機能が役立ちます。 手順については、記事「 他家受粉:WindowsからのLinuxの管理、およびその逆 」で詳しく説明されています。 コマンドはInvoke-Commandコマンドレットから起動されることを思い出してください。







 Invoke-Command -Hostname linux-server -ScriptBlock {some linux commands}
      
      





1Cのような他のシステムでは、事態はさらに興味深いものになります。







1Cでユーザーを作成する



1Cでのユーザーの作成について:AutoITを使用した簿記については、すでに記事「 1C Administrator Screwdriver Set 」に書いています。 v83.comconnector COMオブジェクトを使用して外部から1Cにアクセスするのが便利であることを思い出させてください。 PowerShellはCOMオブジェクトもサポートしているため、ユーザーを新しい方法で作成するためのスクリプトの一部を紹介します。







 $obj=new-object -comobject V83.ComConnector $connect=$obj.Connect("Srvr=""servername"";Ref=""basename"";Usr=""login"";Pwd=""password"";") #   $rights=$connect.Metadata.Roles.find($rght) $newuser= $connect..createuser() $newuser.name = "$($surname) $($name)" $newuser.fullname = "$($surname) $($name) $($fathername)" $newuser.StandardAuthentication = "False" $newuser.OSAuthentication="True" $newuser.OSuser="\\DOMAINNAME\ $($Username)" $newuser.Roles.add($rights) $newuser.write() #    "" $bject=$connect.NewObject(".") $newuserS=$bject.CreateItem() $newuserS.code=$"($surname) $($name)" $newuserS.Description="$($surname) $($name) $($fathername)" $newuserS.write() #    $grp=$connect...($group).() $t=$grp..add() $t. = $newuserS. $grp.write()
      
      





$ rghtはIBユーザー権限であり、 $ groupは目的のユーザーグループです。 両方の値は、名前とともにテンプレートから取得されます。







もちろん、正確なスクリプトは特定の1C構成に依存します。1Cプログラマーに相談することを忘れないでください。







1Cからユーザーを作成する



組織の規律がIT部門の頂点にあるだけではない場合、新しいユーザーの作成を完全に排除できます。 結局のところ、従業員を雇うとき、彼らは通常、人事部の拠点に連れて行かれ、去るとき、彼らは適切なマークを付けます。







ユーザーアカウントの作成、ブロック、または移動の基本は、データベースにユーザーを入力するだけでなく、雇用、解雇、または別のユニットへの移動の順序になります。

1Cの場合、同じJSON形式であっても、データベースから新しい従業員と解雇された従業員を定期的にアップロードできます。 そして、マシンを動作させます。 CSV形式でアップロードを処理するスクリプトの例は、記事「 PowerShellでの人事変更の自動化 」に記載されています。







別のオプションは、スケジュールされたタスクを1Cからすぐに起動することです。1Cの利点は、かなり豊富な言語でもあります。







たとえば、ADでユーザーを作成すると次のようになります。







注意、コードはロシア語です!
  ( , , , ,  = , , AD = "", SID = "",  = "" )   = ;   = COM("LDAP://" + ); AD = .Create("user", "CN=" + ); AD.sAMAccountName = ; AD.description = ; AD.userPrincipalName =  + "@" + ..();   ()  AD.mail = ; ;    AD.pwdLastSet = 0;  AD.pwdLastSet = -1; ; AD.SetInfo(); AD.SetPassword();   = ;  = (); ;    SID = SID(AD.objectSid); AD = AD.distinguishedName; ;    AD.AccountDisabled = ; AD.SetInfo(); ;  ; 
      
      





1CおよびADの動作メカニズムの詳細、および既製の機能の例については、Infostartポータルの記事「 1CからActive Directoryを操作する 」を参照してください。







間接的ではありますが、HRの従業員にユーザーの作成を任せる準備はできていますか?








All Articles