1: $EMIVersion = $Null
2:
3: function Test-EMIClientInstall()
4: { 5: if ($(Test-Path "C:\Inetpub\wwwroot\Incuity\Bin\DataWorks.MI.Core.dll") -eq $false)
6: { 7: Throw "DataWorks.MI.Core.dll not found. Is EMI Client intalled on this machine?"
8: }
9: return $True
10: }
11:
12:
13: function Load-EMIClientAssemblies()
14: { 15: $CoreAssembly = [System.Reflection.Assembly]::LoadWithPartialName("DataWorks.MI.Core") 16: $CoreClientAssembly = [System.Reflection.Assembly]::LoadWithPartialName("DataWorks.MI.Core.Client") 17: }
18:
19:
20: # How to get the version of the Incuity System
21: function Get-EMIVersion()
22: { 23: if( $Script:EMIVersion -eq $Null)
24: { 25: $Version = [DataWorks.MI.Core.Client.Globals]::Version
26: $Script:EMIVersion = $Version
27: }
28: return $Version
29: }
30:
31: function Initialize-EMIClient()
32: { 33: [DataWorks.MI.Core.Client.Globals]::Initialize()
34:
35: }
36:
37:
38: function Get-InSqlwwAdminToken()
39: { 40: $InSqlwwAdminToken = [DataWorks.MI.Core.Item]::GetInstance("System.Security.Mappings.InSqlwwAdminToken") 41: if ($InSqlwwAdminToken -eq $Null)
42: { 43: $InSqlwwAdminToken = New-FixedCredentials -UserName "wwAdmin" -Password "wwAdmin" -TokenName "wwAdminToken"
44: }
45: return $InSqlwwAdminToken
46: }
47:
48:
49: function New-FixedCredentials([string] $UserName, [string] $Password, [string] $TokenName)
50: { 51: Trap { [DataWorks.MI.Core.Persistence]::AbortTransaction(); [DataWorks.MI.Core.Persistence]::CloseTransaction(); throw } 52: &{ 53:
54: $SecurityPath = "Core."
55:
56: If ( $Script:EMIVersion.Major -eq 3)
57: { 58: $SecurityPath = "Core.Security."
59: }
60:
61:
62: [DataWorks.MI.Core.Persistence]::BeginNewTransaction()
63:
64: #Get the Mappings collection property of the System.Security system item
65: $SecurityItem = [DataWorks.MI.Core.Item]::GetInstance([DataWorks.MI.Core.Namespace.NamespaceProvider]::FQNSecurity)
66: [DataWorks.MI.Core.IProperty] $ParentToAddTo = $SecurityItem.Properties["Mappings"]
67:
68: $ValueBag = New-Object -TypeName "DataWorks.MI.Core.Collections.NamedValueBag"
69:
70: $ValueBag.Add("SecurityMappingStrategyHolder", $SecurityItem) 71:
72: #Create new Security Strategy and add it to the System.Security.Mappings property
73: $CredentialsStrategy = [DataWorks.MI.Core.Item]::CreateInstance([string] $($SecurityPath + "UseFixedCredentials"), $TokenName , [DataWorks.MI.Core.Collections.NamedValueBag] $ValueBag, [DataWorks.MI.Core.IProperty] $ParentToAddTo)
74:
75: $ValueBag.Clear()
76:
77: $ValueBag.Add("UserName", $UserName) 78: $ValueBag.Add("Password", [DataWorks.MI.Core.Security.DataEncryptor]::Encrypt($Password)) 79:
80: $MappedCredentialsProperty = $CredentialsStrategy.Properties["MappedCredentials"]
81:
82: #Create new SimpleCredential Login and add it to the new Security Strategy's MappedCredential collection property
83: #Bug if create instance result is not assigned to variable
84: $SimpleCredentials = [DataWorks.MI.Core.Item]::CreateInstance([string] $($SecurityPath + "SimpleCredentials"), "Credentials", $ValueBag, $MappedCredentialsProperty)
85:
86:
87: [DataWorks.MI.Core.Persistence]::CommitTransaction()
88: [DataWorks.MI.Core.Persistence]::CloseTransaction()
89:
90:
91:
92: return $CredentialsStrategy
93: }
94: }
95:
96:
97: function New-InSQLConnector([string] $InSqlConnectorName,[string] $InSqlServerName, $SecurityToken = $(Get-InSqlwwAdminToken), [string] $TimeZone = "Pacific Standard Time" )
98: { 99: $InSQLConnectorTypeItem = [DataWorks.MI.Core.Item]::GetInstance("System.Sources.InSQL") 100: $InSQLConnector = $InSQLConnectorTypeItem.Invoke("CreateInstance", $InSqlConnectorName, $InSqlServerName, $SecurityToken , $TimeZone) 101: return $InSQLConnector
102: }
103:
104:
105: function Get-EMIFolder([string] $FolderName = "MyInSqlNamespace", [string] $ParentFolder = "NotUsed")
106: { 107: # Get MyEnterprise logical Model folder it is of type Core.LogicalModelRoot
108: $LogicalModelFQN = [DataWorks.MI.Core.Namespace.NamespaceProvider]::FQNLogicalModel
109:
110: # Append new Foldername to create new FQN (Fully qualified name)
111: $TargetFolderFQN = [DataWorks.MI.Core.Namespace.FQN]::AppendNamePart($LogicalModelFQN , $FolderName)
112:
113: # Query the new FQN and see whether this folder already exists
114: [DataWorks.MI.Core.Namespace.IItemNsElementInfo] $ElementInfo = [DataWorks.MI.Core.Namespace.NamespaceProvider]::Instance.ResolveFQN($TargetFolderFQN)
115:
116: # If folder item doesn't exist create new one
117: if ( $ElementInfo -eq $null)
118: { 119: $NewFolderItem = New-EMIFolder -FolderName $FolderName
120: return $NewFolderItem
121: }
122: else
123: { 124: if ( $ElementInfo.ItemType.IsA("Core.Folder")) 125: { 126: $TargetFolderItem = $ElementInfo.Item
127: return $TargetFolderItem
128: }
129: else
130: { 131: throw "Specified FQN exists already, but is not a folder!"
132: }
133: }
134: }
135:
136: function New-EMIFolder([string] $FolderName = "MyInSqlNamespace", [string] $ParentFolder = "NotUsed")
137: { 138: # Another way to get the MyEnterprise root folder item of the logical model
139: $RootFolderItem = [DataWorks.MI.Core.Namespace.NamespaceProvider]::Instance[[DataWorks.MI.Core.WellKnownItem]::LogicalModel]
140: $ValueBag = New-Object -TypeName "DataWorks.MI.Core.Collections.NamedValueBag"
141: [DataWorks.MI.Core.IProperty] $ChildrenProperty = $RootFolderItem.Properties["Children"]
142: [DataWorks.MI.Core.IItem] $FolderItem = [DataWorks.MI.Core.Item]::CreateInstance("Core.Folder", $FolderName, $ValueBag, $ChildrenProperty) 143:
144: return $FolderItem
145: }
146:
147:
148: function Import-AllInSQLTags([string] $EMIFolderPath, [DataWorks.MI.Core.IItem] $InSqlConnector)
149: { 150: $ValueBag = New-Object -TypeName "DataWorks.MI.Core.Collections.NamedValueBag"
151: $ValueBag.Add("SourceFolder", [String]::Empty) 152: $ValueBag.Add("ImportPublic", $True) 153: $ValueBag.Add("ExcludeSystem", $False) 154: $ValueBag.Add("ImportPrivate", $True) 155: $ValueBag.Add("TargetFolder", [string] $EMIFolderPath) 156: $InSqlConnector.InvokeWithNamedParams("ImportItems", $ValueBag) 157: }
158:
159: function Wait-ForSyncImportOperationToComplete([int] $PollInterval, [DataWorks.MI.Core.IItem] $InSqlConnector)
160: { 161: While ($True)
162: { 163: [System.Threading.Thread]::Sleep($PollInterval)
164: [string] $LastProgress = $InSqlConnector.Invoke("GetLastSynImportProgress") 165:
166: If ($LastProgress.StartsWith("Error: ")) 167: { 168: Write-Output $LastProgress
169: return $False
170: }
171: elseif ($LastProgress.EndsWith("Done.")) 172: { 173: Write-Output "Import completed successfully."
174: return $True
175: }
176: }
177: }
178:
179: Test-EMIClientInstall
180: Load-EMIClientAssemblies
181: Get-EMIVersion
182: Initialize-EMIClient
183: $NewConnectorItem = New-InSQLConnector -InSqlConnectorName "wwHistorian1" -InSqlServerName "InSql80"
184: $TargetFolderItem = Get-EMIFolder -FolderName "NSwwHistorian1"
185: #$FolderPath = $FolderItem.Properties["FullyQualifiedName"].Value
186: # This is another way to do it
187: #$FolderPath = $FolderItem["FullyQualifiedName"]
188: $FolderPath = "MyEnterprise.NSwwHistorian1"
189: Import-AllInSQLTags -EMIFolderPath $FolderPath -InSQLConnector $NewConnectorItem
190: Wait-ForSyncImportOperationToComplete -PollInterval 1000 -InSqlConnector $NewConnectorItem
191:
192: