
おそらく、あなたの仕事では、私のように、誰がどのようにサービスを提供したかが明確ではない企業のITシステムに対処する必要があります。 会社を完全に稼働させる前に、IT監査を行い、すべてのシステムを整頓することが不可欠です。
多くの場合、注文がないシステムの1つは1Cシステムです。 たとえば、フォルダー名が「new_copybase1_old」または「Base1KompaniyaZP」であるデータベース、または互いに入れ子になったフォルダーを見つけることもできます。
これらのデータベースに誰が何をアクセスできるのかを判断するのは非常に難しい場合があります。 1Cアプリケーション自体のクライアントコンピューター上のデータベースのリストには、わかりにくい名前を付けることもできます。 一般的に、あまり幸せな写真ではありません。
すべてのデータベースを1つの共通標準にまとめ、ユーザーの接続を自動化するときが来たら、猫をお願いします。
すべてのベースを共通の基準に合わせ、物事を整理します-これはすべて良いことです! しかし、最も迅速かつ効率的にそれを行う方法は?
解決策を見つける
Webで検索したところ、このトピックに関する最高の記事がHabréにあることがわかりました。
1. 「データベースリスト1C 8.2の管理」 ;
2. 「何百もの1Cベースを調理し、狂わない方法」
3. 「Active Directoryを使用した1C 8.2データベースのリストの管理」 ;
4. 「1Cデータベースリストの簡単な管理 。 」
Sergey-S-Kovalevによる記事「1Cデータベースリストの簡単な管理」は最も有用であると思われ、有名な引用から始まります。
「1日を失ってから5分で飛ぶ方が良い」(c)m / f翼、脚、尾。
しかし、すべてがそれほど速くて簡単ではありません。
そのため、 Sergey-S-Kovalevユーザーの記事に従ってセットアップを行うには、6つの段階に分かれた手順に従う必要があります。
ステージ1-インベントリ。
ステージ2-1CのADグループ。
ステージ3-1C構成ファイル。
ステージ4-ファイルまたはDFSリソース。
ステージ5-グループポリシー。
ステージ6-ユーザー。
手順1、5の手順は、各企業に対して1回ずつ実行されます。それらにはルーチンはありません。手で簡単に実行できます。
Sergey-S-Kovalevが提供するセットアップスキームは素晴らしいです! スクリプトはありません。すべてが簡単かつ明確に機能します。 しかし、1日ではなく、この作業スキームをセットアップする必要がある場合、たとえば、合計で約200の1Cベースを持つことができる10社で失う必要があります。
つまり、大企業での初期セットアップは非常に長く退屈なものになります。
ステップの一部を自動化し、ステップ数を減らすことをお勧めします。
私が話していることをよりよく理解するために、まず「簡単な1Cデータベース管理」を読むことをお勧めします 。
ステージ1-インベントリ
1.図に示すように、共通の会計リソースにExcelファイルを作成します。
このファイルに古いデータベースとフォルダーの名前を必ず追加して、後でデータベースのコピー元を明確にしてください。 OldBaseName、OldFolderName 。 ファイルはここで取得できます 。
2.会社の最も重要な会計士と一緒に、フィールドに入力します。
BaseName, FolderName, GroupName, AccessUser(1-7)
-
BaseName
列は、IP-Ivanov_BUKHなどの標準に従ってロシア語で手動で入力されます。 -
FolderName
列には、標準(この場合はIP-IVANOV_BUH)に従ってラテンアルファベットが手動で入力されます。 - ADグループの名前は、
FolderName
列に基づいて既に生成されていFolderName
この例ではGRRS_IP-IVANOV_BUHです。Excelでは、他のセルの情報に基づいてセルの内容を補完する方法を知っていると思います。 - AccessUserは、最も重要な会計士自身に尋ねることでアクセスできますが、作業を容易にすることもできます。 これを行うには、たとえば次のコマンドを使用して、ADからアカウンティングレコードのリストを取得します
Get-Aduser -searchbase "OU=Accountants, DC=domain, DC=ru" -filter * -Properties SamAccountname | FT SamAccountname
このリストをファイルの2番目のシートに配置します。 - AccessUserフィールドの横に、このリストをバインドする必要があります。 方法がわからない場合は、「Excelセルにドロップダウンリストを追加する方法」などをGoogleに尋ねるか、ファイルを使用してください。
その結果、最も重要な会計士は、リストからユーザーを選択して、各データベースへのアクセスを単純に付加します。 リストは、Excel自体のツールを使用して事前に並べ替えることができます。たとえば、最も頻繁に使用されるアカウントを最初に配置します。
3.このファイルに入力した後、ファイルを保存し、スクリプトを起動するディレクトリにコピーする必要があります。
Sergey-S-Kovalevファイルとは異なり、ユーザーがすぐにアクセスできるようになり、説明もサーバーとクラスターの名前もありません。 私の環境では、この情報は不要であり、ファイルに含めませんでした。
ステージ2-スクリプトの実行
おそらく、最初の段階の結果として判明したファイルをスクリプトにフィードすることを既にご存じでしょう。 スクリプトは、 Sergey-S-Kovalevがステップ2、3、4、6で説明したすべてのアクションを実行します。
スクリプトは何をしますか:
1.各ベースのグループをADに作成します。
2.各グループの説明フィールドにベースを持つフォルダーへのパスを追加します。
3.各グループの「メモ」フィールドに、データベースの名前とデータベースのあるフォルダーへのパスを追加します。
4.リストに従ってユーザーアクセスグループに追加します。
5.すべてのデータベースのリストを含む共通ファイル1CEStart.cfgを生成し、このファイルを1C構成ファイルとともにネットワークフォルダーに配置します。
6.各データベースのv8iファイルを生成し、これらのファイルを1C構成ファイルのあるネットワークフォルダーに配置します。
7.アクセスリストの各v8iファイルに対応するグループを規定します。
8.データベース用のフォルダを作成し、フォルダのアクセスリストに対応するグループを書き込みます。
一般に、スクリプトは、 Sergey-S-Kovalevが記事で手作業で行ったほぼすべてのことを行います。
スクリプトを実行する前に、以下が必要です。
(これらのアクションの自動化は、これまでの計画にのみ含まれています)
ADグループを作成する
1.ドメインにOUを作成して、1Cデータベースへのアクセス権を持つグループを保存します。 私の例では、$ OU =“ OU = 1C、OU = Resources、DC = domain、DC = ru”になります
2.このOUにグループGRRS_1C_ConfigBasesROを作成します。 グループ「Domain computers」をグループGRRS_1C_ConfigBasesROに追加します
3.このOUにグループGRRS_1CBasesを作成します。
4.このOUにGRUS_1Cadminsグループを作成し、1C管理者を追加します(オプション)
フォルダーを作成する
1. 1Cサーバー上にデータベースを保存するためのフォルダーを作成します。 私たちの場合は1cshareになります
2. [共有]タブの権限で記録するために、GRRS_1CBasesグループに1cshareフォルダーへのアクセスを許可する必要があります。
3. [セキュリティ]タブで、ユーザーグループを削除し、GRRS_1CBasesグループの読み取り権限を登録します。
4.ドメイン内の共有DFSフォルダーまたはフォルダーのみを作成します(例:\\ domain.ru \ DfsShare \ 1cconfig \)
5.このフォルダーに1C構成ファイルがあります。
6.フォルダ\\ domain.ru \ DfsShare \ 1cconfig \に、グループGRRS_1C_ConfigBasesROの読み取り専用アクセス権を付与します。
スクリプトを起動するユーザーは、データベースのあるフォルダーおよび\\ domain.ru \ DfsShare \ 1cconfig \フォルダーへの書き込みアクセス権を持っている必要があります。
スクリプト起動要件
このスクリプトは、Microsoft Access Database Engine 2010 Redistributableを使用してExcelファイルを読み取ることを実装しています
スクリプトを起動するサーバーにこの製品をすぐにインストールすることをお勧めします。
エンジンはここからダウンロードできます 。 オペレーティングシステムのビット深度がエンジンのビット深度と一致することが重要です。
注意! 動作中のクライアントコンピューターからスクリプトを実行する場合、Microsoft Officeのビット深度もエンジンのビット幅と一致する必要があります。
サーバーにエンジンをインストールすることをお勧めします。コンピューターにMicrosoft Officeを再インストールする心配はありません。 スクリプトを実行するには、PowerShellバージョン4.0以降とPowerShellモジュールを備えたADスナップインをコンピューターにインストールする必要があります。
また、次の変数をスクリプトに登録する必要があります。
# 1-,
$1CServer = "nn-1cserver"
# , 1.
$ShareName = "1cshare"
#OU Active Directory, 1c
$OU = “OU=1C, OU=Resources, DC=domain, DC=ru”
# DFS , 1
$1CConfigFolder = "\\domain.ru\DfsShare\1cconfig\"
# ,
$datafile = "BasesBuh.xlsx"
#
$strSheetName = 'Sheet1$'
注: csvではなくExcelの読み取りを実装したのはなぜですか? キリル文字のエンコードを観察する必要があるため、CSVを使用するのは好きではありません。また、CSVは編集に不便です。 Excelファイルを読み取れる場合は、その形式を準備せずにすぐにスクリプトにスリップできます。
ステージ3-ユーザー用のポリシーの作成
Sergey-S-Kovalevは、このスキームの運用に関するポリシーの作成について非常によく説明しています。
1.彼の記事の下で、構成ファイル1CEStart.cfgを共有ネットワークフォルダーからコンピューターのフォルダーにコピーします%ProgramData%\ 1C \ 1CEStart \このコンピューターのポリシーを作成します。
2.さらに、ポリシーでは、各ユーザーの%Appdata%\ 1C \ 1CEStart \ ibases.v8iファイルを確実に消去する必要があります。 新しいコンテンツは、1Cの最初の起動時に1CEStart.cfgファイルから形成されます。
ステージ4-古いデータベースを新しいフォルダーにコピーする
スクリプトを実行し、すべてのグループ、フォルダー、およびファイルを作成したら、古いデータベースを新しい場所にコピーする必要があります。つまり、新しいフォルダーにそれらを配布します。 ここでは、OldFolderName、FolderNameの列が役立ちます。
ここにスクリプト
###########################################################
# AUTHOR : Rinat K. Nugaev - http://www.nugaev.net - rinat@nugaev.net
# DATE : 07-02-2016
# EDIT : 07-03-2016
# COMMENT : This script creates folders, groups, and other
# stuff for 1C envinronment.
# Use it for your own risk!
# VERSION : 1.2
###########################################################
# CHANGELOG
# Version 1.2: 07-03-2016 - Changed the code
# - Added DataFilePath checking
# - Added AD modules installing
# - Changed users's array creating
# - Added Russian comments
# AD PowerShell
Try
{
Import-Module ActiveDirectory -ErrorAction Stop
}
Catch
{
Write-Host "[ERROR]`t ActiveDirectory Powershell ! , !"
Write-Host "[ERROR]`t Windows 2008/2008R2 Import-Module ServerManager"
Write-Host "[ERROR]`t Add-WindowsFeature RSAT-AD-PowerShell"
Write-Host "[ERROR]`t Windows 2012/2012R2 Add-WindowsFeature RSAT-AD-PowerShell"
Exit 1
}
#---------------------------------------------------------------------------------------
# -
#---------------------------------------------------------------------------------------
#
$dataFile = "BasesBuh.xlsx"
# 1-,
$1Cserver = "nn-1cserver"
# 1 , 1.
$ShareName = "1cshare"
#OU Active Directory, 1c
$OU = “OU=1C,OU=Resources,DC=domain,DC=ru”
# DFS , 1
#, , , .
$1CConfigFolder = "\\domain.ru\DfsShare\1cconfig\"
#
#
$strSheetName = 'Sheet1$' # 1$
#----------------------------------------------------------
#
#----------------------------------------------------------
$dataFilePath = $localPath + "\$dataFile"
$localPath = $PSScriptRoot
# 1
$1CBasesCFG = $1CConfigFolder + “1CEStart.cfg”
#
# ACL .
$GRRS_1C_ConfigBasesRO = "GRRS_1C_ConfigBasesRO"
#
# ACL .
$GRRS_1CBases = "GRRS_1CBases"
# 1
$GR_1CAdmins = "GRUS_1Cadmins"
#
If (!(Test-Path -Path $dataFilePath -PathType Any))
{
Write-Host "[ERROR]`t $dataFile ! , $dataFile !" -ForegroundColor Red
Exit 1
}
# Excel- , SQLDB
# Microsoft Access Database Engine 2010 Redistributable
# www.microsoft.com/en-us/download/details.aspx?id=13255
# , . Office
# . , .
$strProvider = "Provider=microsoft.ace.oledb.12.0"
$strDataSource = "Data Source = $dataFilePath"
$strExtend = "Extended Properties=Excel 8.0"
$strQuery = "Select * from [$strSheetName]"
$objConn = New-Object System.Data.OleDb.OleDbConnection("$strProvider;$strDataSource;$strExtend")
$sqlCommand = New-Object System.Data.OleDb.OleDbCommand($strQuery)
$sqlCommand.Connection = $objConn
$objConn.open()
$DataReader = $sqlCommand.ExecuteReader()
#
$AccessArr = New-Object System.Collections.ArrayList
#
While($DataReader.Read())
{
# (.replace(' ','')), - .
$BaseName = $DataReader[2].Tostring().replace(' ','')
$FolderName = $DataReader[3].Tostring().replace(' ','')
$GroupName = $DataReader[4].Tostring().replace(' ','')
# $AccessArr
[void] $AccessArr.Add($DataReader[5].Tostring().replace(' ',''))
[void] $AccessArr.Add($DataReader[6].Tostring().replace(' ',''))
[void] $AccessArr.Add($DataReader[7].Tostring().replace(' ',''))
[void] $AccessArr.Add($DataReader[8].Tostring().replace(' ',''))
[void] $AccessArr.Add($DataReader[8].Tostring().replace(' ',''))
[void] $AccessArr.Add($DataReader[10].Tostring().replace(' ',''))
[void] $AccessArr.Add($DataReader[11].Tostring().replace(' ',''))
# . , .
# . .
$FullPathBase = "\" + "\" + $1Cserver + "\" + $Sharename + "\" + $FolderName
# AD
$CommentBase = “” + “ ” + $BaseName + “ ”
$CommentPath = $FullPathBase
$Comment = $CommentBase + $CommentPath
# ,
$ConfigBaseFile = $1cConfigFolder + $FolderName + “.v8i”
# v8i
# 1, Connect=File
$ConfigBaseFileContent ="[$BaseName]
Connect=File=$FullPathBase
ClientConnectionSpeed=Normal
App=Auto
WA=1
Version=8.3
"
# v8i- 1CEStart.cfg
# v8i-
$ConfigBaseFileContent | Set-Content $ConfigBaseFile -Encoding UTF8
# v8i- 1CEStart.cfg
$1CBasesCFGContent = "CommonInfoBases=$ConfigBaseFile"
# v8i- 1CEStart.cfg
$1CBasesCFGContent | Add-Content $1CBasesCFG -Encoding UTF8
# , .
New-ADGroup -GroupScope DomainLocal -GroupCategory Security `
-name $GroupName -Path $OU -Description $CommentPath -OtherAttributes @{info="$Comment"}
#
Add-ADGroupMember -Identity $GRRS_1C_ConfigBasesRO $GroupName
#
Add-ADGroupMember -Identity $GRRS_1CBases $GroupName
# .
foreach ($i in $AccessArr)
{
if ($i)
{
Add-ADGroupMember -Identity $GroupName $i
}
}
#
New-item -Path $FullPathBase -ItemType directory
#
$acl = Get-Acl $FullPathBase
$GroupOwner = New-Object System.Security.Principal.NTAccount("Builtin", "Administrators")
$acl.SetOwner($GroupOwner)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(“Administrators”,”Modify,FullControl, Synchronize”, “ContainerInherit, ObjectInherit”, “None”, “Allow”)
$acl.AddAccessRule($rule)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(“Domain admins”,”Modify,FullControl, Synchronize”, “ContainerInherit, ObjectInherit”, “None”, “Allow”)
$acl.AddAccessRule($rule)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(“$GroupName”,”Modify, Synchronize”, “ContainerInherit, ObjectInherit”, “None”, “Allow”)
$acl.AddAccessRule($rule)
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(“$GR_1CAdmins”,”Modify, Synchronize”, “ContainerInherit, ObjectInherit”, “None”, “Allow”)
$acl.AddAccessRule($rule)
$acl.SetAccessRuleProtection($True, $False)
Set-Acl $FullPathBase $acl
# v8i-
$aclfl = Get-Acl $ConfigBaseFile
$GroupOwner = New-Object System.Security.Principal.NTAccount("Builtin", "Administrators")
$aclfl.SetOwner($GroupOwner)
$rulefl = New-Object System.Security.AccessControl.FileSystemAccessRule(“Administrators”,”Modify,FullControl, Synchronize”, “Allow”)
$aclfl.AddAccessRule($rulefl)
$rulefl = New-Object System.Security.AccessControl.FileSystemAccessRule(“Domain admins”,”Modify,FullControl, Synchronize”, “Allow”)
$aclfl.AddAccessRule($rulefl)
$rulefl = New-Object System.Security.AccessControl.FileSystemAccessRule(“$GroupName”,”ReadAndExecute, Synchronize”, “Allow”)
$aclfl.AddAccessRule($rulefl)
$rulefl = New-Object System.Security.AccessControl.FileSystemAccessRule(“$GR_1CAdmins”,”ReadAndExecute, Synchronize”, “Allow”)
$aclfl.AddAccessRule($rulefl)
Set-Acl $ConfigBaseFile $aclfl
# 1CEStart.cfg
$aclcf = Get-Acl $1CBasesCFG
$GroupOwner = New-Object System.Security.Principal.NTAccount("Builtin", "Administrators")
$aclcf.SetOwner($GroupOwner)
$rulecf = New-Object System.Security.AccessControl.FileSystemAccessRule(“Administrators”,”Modify,FullControl, Synchronize”, “Allow”)
$aclcf.AddAccessRule($rulecf)
$rulecf = New-Object System.Security.AccessControl.FileSystemAccessRule(“Domain admins”,”Modify,FullControl, Synchronize”, “Allow”)
$aclcf.AddAccessRule($rulecf)
$rulecf = New-Object System.Security.AccessControl.FileSystemAccessRule(“$GRRS_1C_ConfigBasesRO”,”ReadAndExecute, Synchronize”, “Allow”)
$aclcf.AddAccessRule($rulecf)
$rulecf = New-Object System.Security.AccessControl.FileSystemAccessRule(“$GR_1CAdmins”,”ReadAndExecute, Synchronize”, “Allow”)
$aclcf.AddAccessRule($rulecf)
Set-Acl $1CBasesCFG $aclcf
}
#
$dataReader.close()
$objConn.close()
起こりうる困難
どのような理由で理解できませんでしたが、何らかの理由で、すべてのスクリプトが記述されているものの、データベースのあるフォルダーで「すべての子オブジェクトのアクセス許可をこのオブジェクトの継承可能なアクセス許可で置き換える」オプションがオンになりませんでした したがって、データベースを新しい場所にコピーした後、コピーされたファイルに対する権限が親フォルダーから継承されているかどうかを確認してください。
おわりに
同僚、スクリプトはかなりよく文書化されていますが、約1時間でひざの上に書かれています。 その使用に関するすべての責任は、UFOのみにあります。
私(と思う)は、PowerShellで関数を正しく作成する方法、リクエストを作成し、パラメーターを確認する方法、ロギングを実装する方法、スクリプトのヘルプを作成する方法などを知っていますが、これはすべて不必要だと思います。 ただし、いくつかのチェック、たとえば、構成またはパブリックフォルダーのあるディレクトリを実行できます。 しかし、私は、今回ではなく、そのような仕事ではないと思います。
#ChangeLog
- Sergey-S-Kovalevが指摘した不正確さを修正。
- ユーザーが配列n1nj4p0w3rに追加される方法を変更しました。
- Active Directoryモジュールの検証を追加。
- ディレクトリ内のデータを持つファイルの存在のチェックを追加しました。
よろしくお願いします!
すべての人に良い!