diff --git a/ADSyncTest/ADSyncTest.vbproj b/ADSyncTest/ADSyncTest.vbproj
index 9698bbf5..8d9c8289 100644
--- a/ADSyncTest/ADSyncTest.vbproj
+++ b/ADSyncTest/ADSyncTest.vbproj
@@ -129,6 +129,14 @@
+
+ {39ec839a-3c30-4922-a41e-6b09d1dde5c3}
+ Jobs
+
+
+ {EAF0EA75-5FA7-485D-89C7-B2D843B03A96}
+ Database
+
{AB6F09BF-E794-4F6A-94BB-C97C0BA84D64}
Interfaces
diff --git a/ADSyncTest/Form1.Designer.vb b/ADSyncTest/Form1.Designer.vb
index 25f72448..309bfed9 100644
--- a/ADSyncTest/Form1.Designer.vb
+++ b/ADSyncTest/Form1.Designer.vb
@@ -24,6 +24,9 @@ Partial Class Form1
Private Sub InitializeComponent()
Me.Button1 = New System.Windows.Forms.Button()
Me.ListBox1 = New System.Windows.Forms.ListBox()
+ Me.ListBox2 = New System.Windows.Forms.ListBox()
+ Me.Button2 = New System.Windows.Forms.Button()
+ Me.Button3 = New System.Windows.Forms.Button()
Me.SuspendLayout()
'
'Button1
@@ -40,14 +43,43 @@ Partial Class Form1
Me.ListBox1.FormattingEnabled = True
Me.ListBox1.Location = New System.Drawing.Point(245, 12)
Me.ListBox1.Name = "ListBox1"
- Me.ListBox1.Size = New System.Drawing.Size(543, 420)
+ Me.ListBox1.Size = New System.Drawing.Size(244, 420)
Me.ListBox1.TabIndex = 1
'
+ 'ListBox2
+ '
+ Me.ListBox2.FormattingEnabled = True
+ Me.ListBox2.Location = New System.Drawing.Point(495, 12)
+ Me.ListBox2.Name = "ListBox2"
+ Me.ListBox2.Size = New System.Drawing.Size(266, 420)
+ Me.ListBox2.TabIndex = 2
+ '
+ 'Button2
+ '
+ Me.Button2.Location = New System.Drawing.Point(12, 70)
+ Me.Button2.Name = "Button2"
+ Me.Button2.Size = New System.Drawing.Size(227, 38)
+ Me.Button2.TabIndex = 3
+ Me.Button2.Text = "List Groups"
+ Me.Button2.UseVisualStyleBackColor = True
+ '
+ 'Button3
+ '
+ Me.Button3.Location = New System.Drawing.Point(12, 114)
+ Me.Button3.Name = "Button3"
+ Me.Button3.Size = New System.Drawing.Size(227, 35)
+ Me.Button3.TabIndex = 4
+ Me.Button3.Text = "List Users for selected Group"
+ Me.Button3.UseVisualStyleBackColor = True
+ '
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(800, 450)
+ Me.Controls.Add(Me.Button3)
+ Me.Controls.Add(Me.Button2)
+ Me.Controls.Add(Me.ListBox2)
Me.Controls.Add(Me.ListBox1)
Me.Controls.Add(Me.Button1)
Me.Name = "Form1"
@@ -58,4 +90,7 @@ Partial Class Form1
Friend WithEvents Button1 As Button
Friend WithEvents ListBox1 As ListBox
+ Friend WithEvents ListBox2 As ListBox
+ Friend WithEvents Button2 As Button
+ Friend WithEvents Button3 As Button
End Class
diff --git a/ADSyncTest/Form1.vb b/ADSyncTest/Form1.vb
index 2514f9b0..b3dc7359 100644
--- a/ADSyncTest/Form1.vb
+++ b/ADSyncTest/Form1.vb
@@ -1,21 +1,85 @@
Imports DigitalData.Modules.Interfaces
Imports DigitalData.Modules.Logging
+Imports DigitalData.Modules.Interfaces.ActiveDirectoryInterface
+Imports DigitalData.Modules.Database
Public Class Form1
Private _sync As ActiveDirectoryInterface
Private _logConfig As LogConfig
Private _logger As Logger
+ Private _firebird As Firebird
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
+ Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
_logConfig = New LogConfig(LogConfig.PathType.CurrentDirectory)
+ _logConfig.Debug = True
_logger = _logConfig.GetLogger()
- _sync = New ActiveDirectoryInterface(_logConfig)
+ _firebird = New Firebird(_logConfig, "172.24.12.41", "172.24.12.41:E:\DB\Firebird\Databases\DD_ICM.fdb", "sysdba", "dd")
+
+ _sync = New ActiveDirectoryInterface(_logConfig, _firebird)
_sync.Authenticate()
+ Dim oType As Type = Type.GetType("DigitalData.Modules.Jobs.ADSyncJob")
+ Activator.CreateInstance(oType)
+ End Sub
+
+ Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
+ Dim oGroup As String = ListBox1.SelectedItem
+ _sync.SyncUsersForGroup(oGroup)
+
+ '' STEP 1: Get all Groups that have AD_SYNC enabled
+ 'Dim oSQL As String = $"SELECT RECORD_ID, GROUP_NAME FROM VWICM_GROUP WHERE AD_SYNC = 1"
+ 'Dim oResult As DataTable = _firebird.GetDatatable(oSQL)
+
+
+ 'For Each oRow As DataRow In oResult.Rows
+ ' Dim oGroupName As String = oRow.Item("GROUP_NAME")
+ ' Dim oGroupId As Int64 = oRow.Item("RECORD_ID")
+
+ ' ' STEP 2: List all Users for that Group
+ ' Dim oUsers As List(Of ADUser) = _sync.ListUsers(oGroupName)
+
+ ' For Each oUser In oUsers
+ ' ' STEP 3: Check if user exists in DB
+ ' oSQL = $"SELECT FNICM_GET_RECORD4SYSKEY('{oUser.samAccountName}','001-USRNAME') from RDB$DATABASE"
+ ' Dim oResult2 = _firebird.GetScalarValue(oSQL)
+ ' Dim oUserId
+
+ ' ' STEP 3.A: If user does not exists, create and add to group
+ ' If IsDBNull(oResult2) Then
+ ' 'Create user
+ ' oSQL = $"SELECT FNICM_RADM_NEW_USER('{oUser.GivenName}', '{oUser.Surname}', '{oUser.samAccountName}', 'AD-Sync') from RDB$DATABASE"
+ ' Dim oResult3 = _firebird.GetScalarValue(oSQL)
+ ' oUserId = oResult3
+ ' Else
+ ' oUserId = oResult2
+ ' End If
+
+ ' ' STEP 4: Add user to group
+ ' oSQL = $"SELECT FNICM_RADM_NEW_USER2GROUP({oUserId}, {oGroupId}, 'AD-Sync') from RDB$DATABASE"
+ ' Dim oResult4 = _firebird.GetScalarValue(oSQL)
+ ' Next
+ 'Next
+ End Sub
+
+ Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim oGroups = _sync.ListGroups()
For Each oGroup In oGroups
- ListBox1.Items.Add(oGroup.SAMAccountName)
+ ListBox1.Items.Add(oGroup.Name)
Next
End Sub
+
+ Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
+ Dim oGroup As String = ListBox1.SelectedItem
+ Dim oUsers = _sync.ListUsers(oGroup)
+
+ ListBox2.Items.Clear()
+ For Each oUser In oUsers
+ ListBox2.Items.Add(oUser.samAccountName)
+ Next
+
+ If oUsers.Count = 0 Then
+ ListBox2.Items.Add("No users found ¯\_(ツ)_/¯")
+ End If
+ End Sub
End Class
diff --git a/DDMonorepo.sln b/DDMonorepo.sln
index f75b5acb..6c269470 100644
--- a/DDMonorepo.sln
+++ b/DDMonorepo.sln
@@ -69,6 +69,8 @@ Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "License", "Modules.License\
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ADSyncTest", "ADSyncTest\ADSyncTest.vbproj", "{7386AB04-DF8D-4DFB-809D-1FAC8212CB7E}"
EndProject
+Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "JobRunner", "JobRunner\JobRunner.vbproj", "{59461E98-A5AF-438C-A651-5021ACAE82AD}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -171,6 +173,10 @@ Global
{7386AB04-DF8D-4DFB-809D-1FAC8212CB7E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7386AB04-DF8D-4DFB-809D-1FAC8212CB7E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7386AB04-DF8D-4DFB-809D-1FAC8212CB7E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {59461E98-A5AF-438C-A651-5021ACAE82AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {59461E98-A5AF-438C-A651-5021ACAE82AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {59461E98-A5AF-438C-A651-5021ACAE82AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {59461E98-A5AF-438C-A651-5021ACAE82AD}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -200,6 +206,7 @@ Global
{CBE9322E-67A1-4CC5-B25F-4A1B4C9FC55C} = {7AF3F9C2-C939-4A08-95C1-0453207E298A}
{5EBACBFA-F11A-4BBF-8D02-91461F2293ED} = {3E2008C8-27B1-41DD-9B1A-0C4029F6AECC}
{7386AB04-DF8D-4DFB-809D-1FAC8212CB7E} = {8FFE925E-8B84-45F1-93CB-32B1C96F41EB}
+ {59461E98-A5AF-438C-A651-5021ACAE82AD} = {7AF3F9C2-C939-4A08-95C1-0453207E298A}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C1BE4090-A0FD-48AF-86CB-39099D14B286}
diff --git a/DDZUGFeRDService/ZUGFeRDService.vb b/DDZUGFeRDService/ZUGFeRDService.vb
index c93dc77f..ab68a822 100644
--- a/DDZUGFeRDService/ZUGFeRDService.vb
+++ b/DDZUGFeRDService/ZUGFeRDService.vb
@@ -1,6 +1,7 @@
Imports System.IO
Imports DigitalData.Modules.Database
Imports DigitalData.Modules.Logging
+Imports DigitalData.Modules.Logging.LogConfig
Public Class ZUGFeRDService
Private _logConfig As LogConfig
@@ -10,7 +11,7 @@ Public Class ZUGFeRDService
Private _threadRunner As ThreadRunner
Protected Overrides Sub OnStart(ByVal args() As String)
- _logConfig = New LogConfig(LogConfig.PathType.CustomPath, Path.Combine(My.Application.Info.DirectoryPath, "Log"))
+ _logConfig = New LogConfig(PathType.CustomPath, Path.Combine(My.Application.Info.DirectoryPath, "Log"))
_logConfig.Debug = True
_logger = _logConfig.GetLogger()
_logger.Info($"{My.Settings.SERVICE_NAME} is starting.")
diff --git a/EDMI_ClientSuite/ClassService.vb b/EDMI_ClientSuite/ClassService.vb
index 97432ea7..2d353f5d 100644
--- a/EDMI_ClientSuite/ClassService.vb
+++ b/EDMI_ClientSuite/ClassService.vb
@@ -1,7 +1,7 @@
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports DigitalData.Modules.Logging
-Imports DigitalData.Modules.EDMIFileOps.EDMIServiceReference
+Imports DigitalData.Modules.EDMIAPI.EDMIServiceReference
Imports DigitalData.GUIs.ClientSuite.Base
Public Class ClassService
diff --git a/EDMI_ClientSuite/ClassTimer.vb b/EDMI_ClientSuite/ClassTimer.vb
index c415b64e..18da52d0 100644
--- a/EDMI_ClientSuite/ClassTimer.vb
+++ b/EDMI_ClientSuite/ClassTimer.vb
@@ -2,7 +2,7 @@
Imports System.Threading
Imports System.Timers
Imports DigitalData.GUIs.ClientSuite.Base
-Imports DigitalData.Modules.EDMIFileOps.EDMIServiceReference
+Imports DigitalData.Modules.EDMIAPI.EDMIServiceReference
Imports DigitalData.Modules.Logging
Public Class ClassTimer
diff --git a/EDMI_ClientSuite/Common/ClassCommonCommands.vb b/EDMI_ClientSuite/Common/ClassCommonCommands.vb
index 8c95268d..cfdc100f 100644
--- a/EDMI_ClientSuite/Common/ClassCommonCommands.vb
+++ b/EDMI_ClientSuite/Common/ClassCommonCommands.vb
@@ -1,5 +1,5 @@
Imports DigitalData.Modules.Logging
-Imports DigitalData.Modules.EDMIFileOps.EDMIServiceReference
+Imports DigitalData.Modules.EDMIAPI.EDMIServiceReference
Public Class ClassCommonCommands
Private _LogConfig As LogConfig
diff --git a/EDMI_ClientSuite/FormDesigner/frmFormDesigner.vb b/EDMI_ClientSuite/FormDesigner/frmFormDesigner.vb
index 41522de0..26b70dad 100644
--- a/EDMI_ClientSuite/FormDesigner/frmFormDesigner.vb
+++ b/EDMI_ClientSuite/FormDesigner/frmFormDesigner.vb
@@ -126,7 +126,7 @@ Public Class frmFormDesigner
Dim oLayoutItem As LayoutControlItem = DirectCast(sender, LayoutControlItem)
Dim oSelectedControl As BaseEdit = oLayoutItem.Control
- Dim oMetadata As Metadata
+ Dim oMetadata As New Metadata
' Don't load properties for layout items like splitters, separators, etc.
If oLayoutItem.Control Is Nothing Then
diff --git a/EDMI_ClientSuite/MyApplication.vb b/EDMI_ClientSuite/MyApplication.vb
index 15d6aa57..bb071cae 100644
--- a/EDMI_ClientSuite/MyApplication.vb
+++ b/EDMI_ClientSuite/MyApplication.vb
@@ -2,7 +2,7 @@
Imports System.Threading
Imports DigitalData.Modules.Config
Imports DigitalData.Modules.Logging
-Imports DigitalData.Modules.EDMIFileOps.EDMIServiceReference
+Imports DigitalData.Modules.EDMIAPI.EDMIServiceReference
Namespace My
'''
diff --git a/EDMI_ClientSuite/_TEST/frmFileTest.vb b/EDMI_ClientSuite/_TEST/frmFileTest.vb
index ed8ab66b..13aaf27c 100644
--- a/EDMI_ClientSuite/_TEST/frmFileTest.vb
+++ b/EDMI_ClientSuite/_TEST/frmFileTest.vb
@@ -1,5 +1,5 @@
Imports System.IO
-Imports DigitalData.Modules.EDMIFileOps
+Imports DigitalData.Modules.EDMIAPI
Imports DigitalData.Modules.Filesystem
Imports DigitalData.Modules.Logging
diff --git a/EDMI_ClientSuite/frmSplash.vb b/EDMI_ClientSuite/frmSplash.vb
index ffe23b80..4b59fbcd 100644
--- a/EDMI_ClientSuite/frmSplash.vb
+++ b/EDMI_ClientSuite/frmSplash.vb
@@ -2,7 +2,7 @@
Imports System.ServiceModel
Imports System.Threading
Imports DigitalData.Modules.Logging
-Imports DigitalData.Modules.EDMIFileOps.EDMIServiceReference
+Imports DigitalData.Modules.EDMIAPI.EDMIServiceReference
Public NotInheritable Class frmSplash
Private _Worker As New BackgroundWorker()
diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.DocumentResult.datasource b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.DocumentResult.datasource
similarity index 65%
rename from EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.DocumentResult.datasource
rename to EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.DocumentResult.datasource
index f6bab7be..7c84b32e 100644
--- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.DocumentResult.datasource
+++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.DocumentResult.datasource
@@ -6,5 +6,5 @@
cause the file to be unrecognizable by the program.
-->
- DigitalData.Modules.EDMIFileOps.EDMIServiceReference.DocumentResult, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ DigitalData.Modules.EDMIAPI.EDMIServiceReference.DocumentResult
\ No newline at end of file
diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.IndexResult.datasource b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.IndexResult.datasource
similarity index 66%
rename from EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.IndexResult.datasource
rename to EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.IndexResult.datasource
index 2a2da06e..00a7860a 100644
--- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.IndexResult.datasource
+++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.IndexResult.datasource
@@ -6,5 +6,5 @@
cause the file to be unrecognizable by the program.
-->
- DigitalData.Modules.EDMIFileOps.EDMIServiceReference.IndexResult, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ DigitalData.Modules.EDMIAPI.EDMIServiceReference.IndexResult
\ No newline at end of file
diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.NonQueryResult.datasource b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.NonQueryResult.datasource
similarity index 65%
rename from EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.NonQueryResult.datasource
rename to EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.NonQueryResult.datasource
index f729e1d8..6380297c 100644
--- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.NonQueryResult.datasource
+++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.NonQueryResult.datasource
@@ -6,5 +6,5 @@
cause the file to be unrecognizable by the program.
-->
- DigitalData.Modules.EDMIFileOps.EDMIServiceReference.NonQueryResult, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ DigitalData.Modules.EDMIAPI.EDMIServiceReference.NonQueryResult
\ No newline at end of file
diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ScalarResult.datasource b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.ScalarResult.datasource
similarity index 66%
rename from EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ScalarResult.datasource
rename to EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.ScalarResult.datasource
index 7a412454..d2434d7c 100644
--- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ScalarResult.datasource
+++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.ScalarResult.datasource
@@ -6,5 +6,5 @@
cause the file to be unrecognizable by the program.
-->
- DigitalData.Modules.EDMIFileOps.EDMIServiceReference.ScalarResult, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ DigitalData.Modules.EDMIAPI.EDMIServiceReference.ScalarResult
\ No newline at end of file
diff --git a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.TableResult.datasource b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.TableResult.datasource
similarity index 66%
rename from EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.TableResult.datasource
rename to EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.TableResult.datasource
index afc8fe42..54940eb0 100644
--- a/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIFileOps.EDMIServiceReference.TableResult.datasource
+++ b/EDMI_FILE_OPs/Connected Services/EDMIServiceReference/DigitalData.Modules.EDMIAPI.EDMIServiceReference.TableResult.datasource
@@ -6,5 +6,5 @@
cause the file to be unrecognizable by the program.
-->
- DigitalData.Modules.EDMIFileOps.EDMIServiceReference.TableResult, Connected Services.EDMIServiceReference.Reference.vb.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
+ DigitalData.Modules.EDMIAPI.EDMIServiceReference.TableResult
\ No newline at end of file
diff --git a/EDMI_FILE_OPs/Document.vb b/EDMI_FILE_OPs/Document.vb
index 6224a3c5..bcb4fcab 100644
--- a/EDMI_FILE_OPs/Document.vb
+++ b/EDMI_FILE_OPs/Document.vb
@@ -1,5 +1,5 @@
Imports DigitalData.Modules.Logging
-Imports DigitalData.Modules.EDMIFileOps.EDMIServiceReference
+Imports DigitalData.Modules.EDMIAPI.EDMIServiceReference
Imports System.ServiceModel
Imports System.IO
diff --git a/EDMI_FILE_OPs/EDMIAPI.vbproj b/EDMI_FILE_OPs/EDMIAPI.vbproj
index 5cbfc34f..262e4784 100644
--- a/EDMI_FILE_OPs/EDMIAPI.vbproj
+++ b/EDMI_FILE_OPs/EDMIAPI.vbproj
@@ -6,8 +6,8 @@
AnyCPU
{5B1171DC-FFFE-4813-A20D-786AAE47B320}
Library
- DigitalData.Modules.EDMIFileOps
- DigitalData.Modules.EDMIFileOps
+ DigitalData.Modules.EDMIAPI
+ DigitalData.Modules.EDMIAPI
512
Windows
v4.6.1
@@ -18,7 +18,7 @@
true
true
bin\Debug\
- DigitalData.Modules.EDMIFileOps.xml
+ DigitalData.Modules.EDMIAPI.xml
42016,41999,42017,42018,42019,42032,42036,42020,42021,42022
@@ -27,7 +27,7 @@
true
true
bin\Release\
- DigitalData.Modules.EDMIFileOps.xml
+ DigitalData.Modules.EDMIAPI.xml
42016,41999,42017,42018,42019,42032,42036,42020,42021,42022
@@ -106,19 +106,19 @@
-
+
Reference.svcmap
-
+
Reference.svcmap
-
+
Reference.svcmap
-
+
Reference.svcmap
-
+
Reference.svcmap
diff --git a/EDMI_FILE_OPs/My Project/Resources.Designer.vb b/EDMI_FILE_OPs/My Project/Resources.Designer.vb
index 89eb3db3..d44fe572 100644
--- a/EDMI_FILE_OPs/My Project/Resources.Designer.vb
+++ b/EDMI_FILE_OPs/My Project/Resources.Designer.vb
@@ -39,7 +39,7 @@ Namespace My.Resources
Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
Get
If Object.ReferenceEquals(resourceMan, Nothing) Then
- Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("DigitalData.Modules.EDMIFileOps.Resources", GetType(Resources).Assembly)
+ Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("DigitalData.Modules.EDMIAPI.Resources", GetType(Resources).Assembly)
resourceMan = temp
End If
Return resourceMan
diff --git a/EDMI_FILE_OPs/My Project/Settings.Designer.vb b/EDMI_FILE_OPs/My Project/Settings.Designer.vb
index b45a0ad8..9950efab 100644
--- a/EDMI_FILE_OPs/My Project/Settings.Designer.vb
+++ b/EDMI_FILE_OPs/My Project/Settings.Designer.vb
@@ -64,9 +64,9 @@ Namespace My
Friend Module MySettingsProperty
_
- Friend ReadOnly Property Settings() As Global.DigitalData.Modules.EDMIFileOps.My.MySettings
+ Friend ReadOnly Property Settings() As Global.DigitalData.Modules.EDMIAPI.My.MySettings
Get
- Return Global.DigitalData.Modules.EDMIFileOps.My.MySettings.Default
+ Return Global.DigitalData.Modules.EDMIAPI.My.MySettings.Default
End Get
End Property
End Module
diff --git a/JobRunner/App.config b/JobRunner/App.config
new file mode 100644
index 00000000..f6c972d9
--- /dev/null
+++ b/JobRunner/App.config
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DDJobRunner
+
+
+ Digital Data Job Runner
+
+
+ False
+
+
+ 1,2,3,4,5,6,7,8,9,10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+
+
+
+
\ No newline at end of file
diff --git a/JobRunner/JobRunner.vb b/JobRunner/JobRunner.vb
new file mode 100644
index 00000000..e6c7a376
--- /dev/null
+++ b/JobRunner/JobRunner.vb
@@ -0,0 +1,74 @@
+Imports System.ComponentModel
+Imports System.Timers
+Imports DigitalData.Modules.Database
+Imports DigitalData.Modules.Jobs
+Imports DigitalData.Modules.Logging
+
+Public Class JobRunner
+ Private WithEvents _workerThread As BackgroundWorker
+ Private WithEvents _workerTimer As Timer
+
+ Private _interval As Long
+ Private _logConfig As LogConfig
+ Private _logger As Logger
+ Private _firebird As Firebird
+
+ Public Sub New(LogConfig As LogConfig, Firebird As Firebird, Interval As Long)
+ _logConfig = LogConfig
+ _logger = _logConfig.GetLogger()
+ _firebird = Firebird
+ _interval = Interval
+
+ _workerTimer = New Timer()
+ _workerThread = New BackgroundWorker() With {
+ .WorkerReportsProgress = False,
+ .WorkerSupportsCancellation = True
+ }
+ End Sub
+
+ Public Sub Start()
+ _workerTimer.Interval = _interval * 1000
+ _workerTimer.Start()
+ _logger.Debug("JobRunner started with {0}s Interval.", _interval)
+ End Sub
+
+ Public Sub [Stop]()
+ Try
+ If _workerThread.IsBusy Then
+ _workerThread.CancelAsync()
+ _logger.Debug("Background Worker cancelled.")
+ End If
+ _workerTimer.Stop()
+ _logger.Debug("Background Worker stopped.")
+ Catch ex As Exception
+ _logger.Error(ex)
+ End Try
+ End Sub
+
+ Private Sub TimerElapsed(sender As Object, e As ElapsedEventArgs) Handles _workerTimer.Elapsed
+ If Not _workerThread.IsBusy Then
+ _workerThread.RunWorkerAsync()
+ Else
+ _logger.Warn("Background Worker is busy")
+ End If
+ End Sub
+
+ Private Sub DoWork(sender As Object, e As DoWorkEventArgs) Handles _workerThread.DoWork
+ Try
+ Dim args As WorkerArgs = e.Argument
+
+ _logger.Debug("Background worker running..")
+
+ ' TODO: WORK
+ 'Dim job As New ImportZUGFeRDFiles(_logConfig, _firebird)
+ 'job.Start(args)
+ Catch ex As Exception
+ _logger.Warn("Background worker failed!")
+ _logger.Error(ex)
+ End Try
+ End Sub
+
+ Private Sub WorkCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles _workerThread.RunWorkerCompleted
+ _logger.Debug("Background worker completed!")
+ End Sub
+End Class
diff --git a/JobRunner/JobRunner.vbproj b/JobRunner/JobRunner.vbproj
new file mode 100644
index 00000000..6a0e0ea7
--- /dev/null
+++ b/JobRunner/JobRunner.vbproj
@@ -0,0 +1,156 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {59461E98-A5AF-438C-A651-5021ACAE82AD}
+ WinExe
+ DigitalData.Services.JobRunner.WindowsService
+ DigitalData.Services.JobRunner
+ DigitalData.Services.JobRunner
+ 512
+ Console
+ v4.6.1
+ true
+
+
+ AnyCPU
+ true
+ full
+ true
+ true
+ bin\Debug\
+ DigitalData.Services.JobRunner.xml
+ 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022
+
+
+ AnyCPU
+ pdbonly
+ false
+ true
+ true
+ bin\Release\
+ DigitalData.Services.JobRunner.xml
+ 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022
+
+
+ On
+
+
+ Binary
+
+
+ Off
+
+
+ On
+
+
+
+
+
+
+
+ ..\LookupGrid\obj\Debug\DigitalData.Controls.LookupGrid.dll
+
+
+
+ ..\packages\NLog.4.5.11\lib\net45\NLog.dll
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+ Application.myapp
+
+
+ Component
+
+
+ Component
+
+
+ WindowsService.vb
+
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+ VbMyResourcesResXFileCodeGenerator
+ Resources.Designer.vb
+ My.Resources
+ Designer
+
+
+ WindowsService.vb
+
+
+
+
+ MyApplicationCodeGenerator
+ Application.Designer.vb
+
+
+ SettingsSingleFileGenerator
+ My
+ Settings.Designer.vb
+
+
+
+
+
+
+ {39ec839a-3c30-4922-a41e-6b09d1dde5c3}
+ Jobs
+
+
+ {EAF0EA75-5FA7-485D-89C7-B2D843B03A96}
+ Database
+
+
+ {903B2D7D-3B80-4BE9-8713-7447B704E1B0}
+ Logging
+
+
+
+
\ No newline at end of file
diff --git a/JobRunner/My Project/Application.Designer.vb b/JobRunner/My Project/Application.Designer.vb
new file mode 100644
index 00000000..8ab460ba
--- /dev/null
+++ b/JobRunner/My Project/Application.Designer.vb
@@ -0,0 +1,13 @@
+'------------------------------------------------------------------------------
+'
+' Dieser Code wurde von einem Tool generiert.
+' Laufzeitversion:4.0.30319.42000
+'
+' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
+' der Code erneut generiert wird.
+'
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
diff --git a/JobRunner/My Project/Application.myapp b/JobRunner/My Project/Application.myapp
new file mode 100644
index 00000000..602de37e
--- /dev/null
+++ b/JobRunner/My Project/Application.myapp
@@ -0,0 +1,10 @@
+
+
+ false
+ false
+ 0
+ true
+ 0
+ 3
+ true
+
diff --git a/JobRunner/My Project/AssemblyInfo.vb b/JobRunner/My Project/AssemblyInfo.vb
new file mode 100644
index 00000000..df2bc85e
--- /dev/null
+++ b/JobRunner/My Project/AssemblyInfo.vb
@@ -0,0 +1,35 @@
+Imports System
+Imports System.Reflection
+Imports System.Runtime.InteropServices
+
+' Allgemeine Informationen über eine Assembly werden über die folgenden
+' Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
+' die einer Assembly zugeordnet sind.
+
+' Werte der Assemblyattribute überprüfen
+
+
+
+
+
+
+
+
+
+
+'Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird.
+
+
+' Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
+'
+' Hauptversion
+' Nebenversion
+' Buildnummer
+' Revision
+'
+' Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
+' übernehmen, indem Sie "*" eingeben:
+'
+
+
+
diff --git a/JobRunner/My Project/Resources.Designer.vb b/JobRunner/My Project/Resources.Designer.vb
new file mode 100644
index 00000000..7fb8b450
--- /dev/null
+++ b/JobRunner/My Project/Resources.Designer.vb
@@ -0,0 +1,63 @@
+'------------------------------------------------------------------------------
+'
+' Dieser Code wurde von einem Tool generiert.
+' Laufzeitversion:4.0.30319.42000
+'
+' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
+' der Code erneut generiert wird.
+'
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+Imports System
+
+Namespace My.Resources
+
+ 'Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
+ '-Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
+ 'Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
+ 'mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
+ '''
+ ''' Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
+ '''
+ _
+ Friend Module Resources
+
+ Private resourceMan As Global.System.Resources.ResourceManager
+
+ Private resourceCulture As Global.System.Globalization.CultureInfo
+
+ '''
+ ''' Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
+ '''
+ _
+ Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager
+ Get
+ If Object.ReferenceEquals(resourceMan, Nothing) Then
+ Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("DigitalData.Services.JobRunner.Resources", GetType(Resources).Assembly)
+ resourceMan = temp
+ End If
+ Return resourceMan
+ End Get
+ End Property
+
+ '''
+ ''' Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
+ ''' Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
+ '''
+ _
+ Friend Property Culture() As Global.System.Globalization.CultureInfo
+ Get
+ Return resourceCulture
+ End Get
+ Set
+ resourceCulture = value
+ End Set
+ End Property
+ End Module
+End Namespace
diff --git a/JobRunner/My Project/Resources.resx b/JobRunner/My Project/Resources.resx
new file mode 100644
index 00000000..af7dbebb
--- /dev/null
+++ b/JobRunner/My Project/Resources.resx
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/JobRunner/My Project/Settings.Designer.vb b/JobRunner/My Project/Settings.Designer.vb
new file mode 100644
index 00000000..501da1af
--- /dev/null
+++ b/JobRunner/My Project/Settings.Designer.vb
@@ -0,0 +1,154 @@
+'------------------------------------------------------------------------------
+'
+' Dieser Code wurde von einem Tool generiert.
+' Laufzeitversion:4.0.30319.42000
+'
+' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
+' der Code erneut generiert wird.
+'
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+Namespace My
+
+ _
+ Partial Friend NotInheritable Class MySettings
+ Inherits Global.System.Configuration.ApplicationSettingsBase
+
+ Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings)
+
+#Region "Automatische My.Settings-Speicherfunktion"
+#If _MyType = "WindowsForms" Then
+ Private Shared addedHandler As Boolean
+
+ Private Shared addedHandlerLockObject As New Object
+
+ _
+ Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs)
+ If My.Application.SaveMySettingsOnExit Then
+ My.Settings.Save()
+ End If
+ End Sub
+#End If
+#End Region
+
+ Public Shared ReadOnly Property [Default]() As MySettings
+ Get
+
+#If _MyType = "WindowsForms" Then
+ If Not addedHandler Then
+ SyncLock addedHandlerLockObject
+ If Not addedHandler Then
+ AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
+ addedHandler = True
+ End If
+ End SyncLock
+ End If
+#End If
+ Return defaultInstance
+ End Get
+ End Property
+
+ _
+ Public ReadOnly Property SERVICE_NAME() As String
+ Get
+ Return CType(Me("SERVICE_NAME"),String)
+ End Get
+ End Property
+
+ _
+ Public ReadOnly Property SERVICE_DISPLAY_NAME() As String
+ Get
+ Return CType(Me("SERVICE_DISPLAY_NAME"),String)
+ End Get
+ End Property
+
+ _
+ Public ReadOnly Property JOB_ADSYNC_ENABLED() As Boolean
+ Get
+ Return CType(Me("JOB_ADSYNC_ENABLED"),Boolean)
+ End Get
+ End Property
+
+ _
+ Public ReadOnly Property JOB_ADSYNC_INTERVAL() As String
+ Get
+ Return CType(Me("JOB_ADSYNC_INTERVAL"),String)
+ End Get
+ End Property
+
+ _
+ Public ReadOnly Property DB_DATASOURCE() As String
+ Get
+ Return CType(Me("DB_DATASOURCE"),String)
+ End Get
+ End Property
+
+ _
+ Public ReadOnly Property DB_DATABASE() As String
+ Get
+ Return CType(Me("DB_DATABASE"),String)
+ End Get
+ End Property
+
+ _
+ Public ReadOnly Property DB_USER() As String
+ Get
+ Return CType(Me("DB_USER"),String)
+ End Get
+ End Property
+
+ _
+ Public ReadOnly Property DB_PASSWORD() As String
+ Get
+ Return CType(Me("DB_PASSWORD"),String)
+ End Get
+ End Property
+
+ _
+ Public ReadOnly Property JOB_INTERVAL() As Long
+ Get
+ Return CType(Me("JOB_INTERVAL"),Long)
+ End Get
+ End Property
+ End Class
+End Namespace
+
+Namespace My
+
+ _
+ Friend Module MySettingsProperty
+
+ _
+ Friend ReadOnly Property Settings() As Global.DigitalData.Services.JobRunner.My.MySettings
+ Get
+ Return Global.DigitalData.Services.JobRunner.My.MySettings.Default
+ End Get
+ End Property
+ End Module
+End Namespace
diff --git a/JobRunner/My Project/Settings.settings b/JobRunner/My Project/Settings.settings
new file mode 100644
index 00000000..ccd102fc
--- /dev/null
+++ b/JobRunner/My Project/Settings.settings
@@ -0,0 +1,33 @@
+
+
+
+
+
+ DDJobRunner
+
+
+ Digital Data Job Runner
+
+
+ False
+
+
+ 1,2,3,4,5,6,7,8,9,10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 120
+
+
+
\ No newline at end of file
diff --git a/JobRunner/ProjectInstaller.vb b/JobRunner/ProjectInstaller.vb
new file mode 100644
index 00000000..e066985c
--- /dev/null
+++ b/JobRunner/ProjectInstaller.vb
@@ -0,0 +1,24 @@
+Imports System.ComponentModel
+Imports System.Configuration.Install
+Imports System.ServiceProcess
+
+
+Public Class ProjectInstaller
+ Inherits Installer
+
+ Private ReadOnly process As ServiceProcessInstaller
+ Private ReadOnly components As IContainer
+ Private ReadOnly service As ServiceInstaller
+
+ Public Sub New()
+ process = New ServiceProcessInstaller With {
+ .Account = ServiceAccount.LocalSystem
+ }
+ service = New ServiceInstaller With {
+ .ServiceName = My.Settings.SERVICE_NAME,
+ .DisplayName = My.Settings.SERVICE_DISPLAY_NAME
+ }
+ Installers.Add(process)
+ Installers.Add(service)
+ End Sub
+End Class
diff --git a/JobRunner/WindowsService.Designer.vb b/JobRunner/WindowsService.Designer.vb
new file mode 100644
index 00000000..fb0f2814
--- /dev/null
+++ b/JobRunner/WindowsService.Designer.vb
@@ -0,0 +1,50 @@
+Imports System.ServiceProcess
+
+
+Partial Class WindowsService
+ Inherits System.ServiceProcess.ServiceBase
+
+ 'UserService überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
+
+ Protected Overrides Sub Dispose(ByVal disposing As Boolean)
+ Try
+ If disposing AndAlso components IsNot Nothing Then
+ components.Dispose()
+ End If
+ Finally
+ MyBase.Dispose(disposing)
+ End Try
+ End Sub
+
+ ' Der Haupteinstiegspunkt für den Prozess
+
+
+ Shared Sub Main()
+ Dim ServicesToRun() As System.ServiceProcess.ServiceBase
+
+ ' Innerhalb eines Prozesses können mehrere NT-Dienste ausgeführt werden. Um einen
+ ' weiteren Dienst zu diesem Prozess hinzuzufügen, ändern Sie die folgende Zeile,
+ ' um ein zweites Dienstobjekt zu erstellen. Zum Beispiel
+ '
+ ' ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService}
+ '
+ ServicesToRun = New System.ServiceProcess.ServiceBase() {New WindowsService}
+
+ System.ServiceProcess.ServiceBase.Run(ServicesToRun)
+ End Sub
+
+ 'Wird vom Komponenten-Designer benötigt.
+ Private components As System.ComponentModel.IContainer
+
+ ' Hinweis: Die folgende Prozedur ist für den Komponenten-Designer erforderlich.
+ ' Das Bearbeiten ist mit dem Komponenten-Designer möglich.
+ ' Das Bearbeiten mit dem Code-Editor ist nicht möglich.
+
+ Private Sub InitializeComponent()
+ '
+ 'Service1
+ '
+ Me.ServiceName = "Service1"
+
+ End Sub
+End Class
diff --git a/JobRunner/WindowsService.resx b/JobRunner/WindowsService.resx
new file mode 100644
index 00000000..e5858cc2
--- /dev/null
+++ b/JobRunner/WindowsService.resx
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ False
+
+
\ No newline at end of file
diff --git a/JobRunner/WindowsService.vb b/JobRunner/WindowsService.vb
new file mode 100644
index 00000000..166892c5
--- /dev/null
+++ b/JobRunner/WindowsService.vb
@@ -0,0 +1,38 @@
+Imports System.IO
+Imports DigitalData.Modules.Database
+Imports DigitalData.Modules.Logging
+Imports DigitalData.Modules.Logging.LogConfig
+
+Public Class WindowsService
+ Private _logConfig As LogConfig
+ Private _logger As Logger
+ Private _firebird As Firebird
+
+ Private _jobRunner As JobRunner
+
+ Protected Overrides Sub OnStart(ByVal args() As String)
+ _logConfig = New LogConfig(PathType.CustomPath, Path.Combine(My.Application.Info.DirectoryPath, "Log"))
+ _logConfig.Debug = True
+ _logger = _logConfig.GetLogger()
+ _logger.Info($"{My.Settings.SERVICE_NAME} is starting.")
+
+ Dim oDataSource As String = My.Settings.DB_DATASOURCE
+ Dim oDatabase As String = My.Settings.DB_DATABASE
+ Dim oUser As String = My.Settings.DB_USER
+ Dim oPassword As String = My.Settings.DB_PASSWORD
+ Dim oInterval As Long = My.Settings.JOB_INTERVAL
+
+ _firebird = New Firebird(_logConfig, oDataSource, oDatabase, oUser, oPassword)
+
+ Try
+ _jobRunner = New JobRunner(_logConfig, _firebird, oInterval)
+ _jobRunner.Start()
+ Catch ex As Exception
+ _logger.Error(ex)
+ End Try
+ End Sub
+
+ Protected Overrides Sub OnStop()
+ _logger.Info($"{My.Settings.SERVICE_NAME} is stopping.")
+ End Sub
+End Class
diff --git a/JobRunner/packages.config b/JobRunner/packages.config
new file mode 100644
index 00000000..f89fa324
--- /dev/null
+++ b/JobRunner/packages.config
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Jobs/EDMI/ADSync/ADSyncArgs.vb b/Jobs/EDMI/ADSync/ADSyncArgs.vb
new file mode 100644
index 00000000..27845e36
--- /dev/null
+++ b/Jobs/EDMI/ADSync/ADSyncArgs.vb
@@ -0,0 +1,3 @@
+Public Class ADSyncArgs
+
+End Class
diff --git a/Jobs/EDMI/ADSync/ADSyncJob.vb b/Jobs/EDMI/ADSync/ADSyncJob.vb
new file mode 100644
index 00000000..fba9ad50
--- /dev/null
+++ b/Jobs/EDMI/ADSync/ADSyncJob.vb
@@ -0,0 +1,9 @@
+Imports DigitalData.Modules.Jobs
+
+Public Class ADSyncJob
+ Implements IJob(Of ADSyncArgs)
+
+ Public Sub Start(Arguments As ADSyncArgs) Implements IJob(Of ADSyncArgs).Start
+
+ End Sub
+End Class
diff --git a/Jobs/EDMI/ZUGFeRD/EmailData.vb b/Jobs/EDMI/ZUGFeRD/EmailData.vb
new file mode 100644
index 00000000..ed37e543
--- /dev/null
+++ b/Jobs/EDMI/ZUGFeRD/EmailData.vb
@@ -0,0 +1,5 @@
+Public Class EmailData
+ Public Attachment As String
+ Public Subject As String
+ Public From As String
+End Class
\ No newline at end of file
diff --git a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb
index 0edef0a6..a4e36fbe 100644
--- a/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb
+++ b/Jobs/EDMI/ZUGFeRD/ImportZUGFeRDFiles.vb
@@ -5,6 +5,7 @@ Imports System.Linq
Imports System.Text.RegularExpressions
Imports DigitalData.Modules.Database
Imports DigitalData.Modules.Interfaces
+Imports DigitalData.Modules.Jobs
Imports DigitalData.Modules.Jobs.Exceptions
Imports DigitalData.Modules.Logging
Imports FirebirdSql.Data.FirebirdClient
@@ -24,36 +25,6 @@ Public Class ImportZUGFeRDFiles
Private _firebird As Firebird
Private _filesystem As Filesystem.File
- Public Class WorkerArgs
- Public WatchDirectories As List(Of String)
- Public SuccessDirectory As String
- Public ErrorDirectory As String
- Public OriginalEmailDirectory As String
- Public RejectedEmailDirectory As String
- Public PropertyMap As Dictionary(Of String, XmlItemProperty)
-
- Public Sub New()
- WatchDirectories = New List(Of String)
- SuccessDirectory = Nothing
- ErrorDirectory = Nothing
- OriginalEmailDirectory = Nothing
- RejectedEmailDirectory = Nothing
- PropertyMap = New Dictionary(Of String, XmlItemProperty)
- End Sub
- End Class
-
- Public Class EmailData
- Public Attachment As String
- Public Subject As String
- Public From As String
- End Class
-
- Public Class XmlItemProperty
- Public TableName As String
- Public Description As String
- Public IsRequired As Boolean
- End Class
-
Public Sub New(LogConfig As LogConfig, Firebird As Firebird)
_logConfig = LogConfig
_logger = LogConfig.GetLogger()
diff --git a/Jobs/EDMI/ZUGFeRD/WorkerArgs.vb b/Jobs/EDMI/ZUGFeRD/WorkerArgs.vb
new file mode 100644
index 00000000..5b9d4393
--- /dev/null
+++ b/Jobs/EDMI/ZUGFeRD/WorkerArgs.vb
@@ -0,0 +1,19 @@
+Imports System.Collections.Generic
+
+Public Class WorkerArgs
+ Public WatchDirectories As List(Of String)
+ Public SuccessDirectory As String
+ Public ErrorDirectory As String
+ Public OriginalEmailDirectory As String
+ Public RejectedEmailDirectory As String
+ Public PropertyMap As Dictionary(Of String, XmlItemProperty)
+
+ Public Sub New()
+ WatchDirectories = New List(Of String)
+ SuccessDirectory = Nothing
+ ErrorDirectory = Nothing
+ OriginalEmailDirectory = Nothing
+ RejectedEmailDirectory = Nothing
+ PropertyMap = New Dictionary(Of String, XmlItemProperty)
+ End Sub
+End Class
\ No newline at end of file
diff --git a/Jobs/EDMI/ZUGFeRD/XmlItemProperty.vb b/Jobs/EDMI/ZUGFeRD/XmlItemProperty.vb
new file mode 100644
index 00000000..57e98415
--- /dev/null
+++ b/Jobs/EDMI/ZUGFeRD/XmlItemProperty.vb
@@ -0,0 +1,5 @@
+Public Class XmlItemProperty
+ Public TableName As String
+ Public Description As String
+ Public IsRequired As Boolean
+End Class
\ No newline at end of file
diff --git a/Jobs/IJob.vb b/Jobs/IJob.vb
index cb1aab71..6cd3f6dc 100644
--- a/Jobs/IJob.vb
+++ b/Jobs/IJob.vb
@@ -1,3 +1,7 @@
Public Interface IJob
Sub Start(Arguments As Object)
End Interface
+
+Public Interface IJob(Of T)
+ Sub Start(Arguments As T)
+End Interface
diff --git a/Jobs/Jobs.vbproj b/Jobs/Jobs.vbproj
index 52d3116f..fc678fc3 100644
--- a/Jobs/Jobs.vbproj
+++ b/Jobs/Jobs.vbproj
@@ -57,6 +57,10 @@
+
+ SettingsSingleFileGenerator
+ Settings.Designer.vb
+
@@ -78,11 +82,21 @@
+
+
+
+
+
+
+ True
+ True
+ Settings.settings
+
diff --git a/Jobs/My Project/Settings.Designer.vb b/Jobs/My Project/Settings.Designer.vb
new file mode 100644
index 00000000..b89e781b
--- /dev/null
+++ b/Jobs/My Project/Settings.Designer.vb
@@ -0,0 +1,71 @@
+'------------------------------------------------------------------------------
+'
+' Dieser Code wurde von einem Tool generiert.
+' Laufzeitversion:4.0.30319.42000
+'
+' Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
+' der Code erneut generiert wird.
+'
+'------------------------------------------------------------------------------
+
+Option Strict On
+Option Explicit On
+
+
+
+ _
+Partial Friend NotInheritable Class Settings
+ Inherits Global.System.Configuration.ApplicationSettingsBase
+
+ Private Shared defaultInstance As Settings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New Settings()),Settings)
+
+#Region "Automatische My.Settings-Speicherfunktion"
+#If _MyType = "WindowsForms" Then
+ Private Shared addedHandler As Boolean
+
+ Private Shared addedHandlerLockObject As New Object
+
+ _
+ Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs)
+ If My.Application.SaveMySettingsOnExit Then
+ My.Settings.Save()
+ End If
+ End Sub
+#End If
+#End Region
+
+ Public Shared ReadOnly Property [Default]() As Settings
+ Get
+
+#If _MyType = "WindowsForms" Then
+ If Not addedHandler Then
+ SyncLock addedHandlerLockObject
+ If Not addedHandler Then
+ AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings
+ addedHandler = True
+ End If
+ End SyncLock
+ End If
+#End If
+ Return defaultInstance
+ End Get
+ End Property
+End Class
+
+Namespace My
+
+ _
+ Friend Module MySettingsProperty
+
+ _
+ Friend ReadOnly Property Settings() As Global.DigitalData.Modules.Jobs.Settings
+ Get
+ Return Global.DigitalData.Modules.Jobs.Settings.Default
+ End Get
+ End Property
+ End Module
+End Namespace
diff --git a/Jobs/My Project/Settings.settings b/Jobs/My Project/Settings.settings
new file mode 100644
index 00000000..e69de29b
diff --git a/Modules.Interfaces/ActiveDirectoryInterface.vb b/Modules.Interfaces/ActiveDirectoryInterface.vb
index 75a724bf..b9549f4a 100644
--- a/Modules.Interfaces/ActiveDirectoryInterface.vb
+++ b/Modules.Interfaces/ActiveDirectoryInterface.vb
@@ -1,9 +1,12 @@
Imports System.DirectoryServices
+Imports System.DirectoryServices.AccountManagement
+Imports DigitalData.Modules.Database
Imports DigitalData.Modules.Logging
Public Class ActiveDirectoryInterface
Private _logConfig As LogConfig
Private _logger As Logger
+ Private _firebird As Firebird
Private _rootPath As String
Private _rootNode As DirectoryEntry
@@ -18,9 +21,11 @@ Public Class ActiveDirectoryInterface
Private Const NAME = "name"
Private Const OBJECTCATEGORY = "objectCategory"
- Public Sub New(LogConfig As LogConfig, Optional RootPath As String = Nothing)
+ Public Sub New(LogConfig As LogConfig, Firebird As Firebird, Optional RootPath As String = Nothing)
_logConfig = LogConfig
_logger = _logConfig.GetLogger()
+ _firebird = Firebird
+
If RootPath Is Nothing Then
_rootPath = $"LDAP://{Environment.UserDomainName}"
Else
@@ -28,25 +33,86 @@ Public Class ActiveDirectoryInterface
End If
End Sub
- Private Function GetRootNode() As DirectoryEntry
- Dim oEntry As New DirectoryEntry(_rootPath) With {
- .AuthenticationType = AuthenticationTypes.Secure,
- .Password = Nothing,
- .Username = Nothing
- }
+ Public Function SyncUsersForGroup(GroupName As String) As List(Of ADUser)
+ Dim oUsers As New List(Of ADUser)
+ Dim oSyncedUsers As New List(Of ADUser)
+ Dim oGroupId As Int64 = Nothing
- Return oEntry
- End Function
- Private Function GetRootNode(Username As String, Password As String) As DirectoryEntry
- Dim oEntry As New DirectoryEntry(_rootPath) With {
- .AuthenticationType = AuthenticationTypes.Secure,
- .Password = Username,
- .Username = Password
- }
+ Try
+ _logger.Debug("Fetching users from ActiveDirectory")
+ oUsers = ListUsers(GroupName)
+ _logger.Debug("Found {0} users", oUsers.Count)
+ Catch ex As Exception
+ _logger.Error(ex)
+ Return Nothing
+ End Try
- Return oEntry
+ If oUsers.Count = 0 Then
+ _logger.Debug("Group {0} does not contain any users.", GroupName)
+ Return oSyncedUsers
+ End If
+
+ Try
+ _logger.Debug("Getting group Id for group {0}", GroupName)
+ oGroupId = GetGroupId(GroupName)
+
+
+ If oGroupId = 0 Then
+ _logger.Warn("Group {0} does not exist in database. Exiting", GroupName)
+ Return Nothing
+ End If
+
+ _logger.Debug("Using group Id {0}", oGroupId)
+ Catch ex As Exception
+ _logger.Error(ex)
+ Return Nothing
+ End Try
+
+ For Each oUser In oUsers
+ Dim oUserId As Int64
+ Dim oUserExists As Boolean = False
+
+ ' Check if user already exists
+ Try
+ _logger.Debug("Checking if user {0} exists", oUser)
+ oUserId = GetUserId(oUser.samAccountName)
+ oUserExists = Not IsNothing(oUserId)
+ _logger.Debug("User {0} exists in database: ", oUser, oUserExists)
+ Catch ex As Exception
+ _logger.Error(ex)
+ _logger.Warn("Could not get UserId for user. Skipping")
+ Continue For
+ End Try
+
+ ' I user does not exist, create a new user
+ Try
+ If Not oUserExists Then
+ _logger.Debug("Creating new user for {0}", oUser)
+ oUserId = CreateUser(oUser)
+ _logger.Debug("User created with Id {0}", oUserId)
+ End If
+ Catch ex As Exception
+ _logger.Error(ex)
+ _logger.Warn("Could not create user. Skipping")
+ Continue For
+ End Try
+
+ ' Add the user to group
+ Try
+ AddUserToGroup(oUserId, oGroupId)
+ Catch ex As Exception
+ _logger.Error(ex)
+ _logger.Warn("Could not add user to group. Skipping")
+ Continue For
+ End Try
+
+ oSyncedUsers.Add(oUser)
+ Next
+
+ Return oSyncedUsers
End Function
+
Public Sub Authenticate()
Try
Dim oEntry = GetRootNode()
@@ -70,19 +136,17 @@ Public Class ActiveDirectoryInterface
End Try
End Sub
- Public Function ListGroups() As List(Of ADGroup)
- Return ListGroups(_rootNode)
+ Public Function ListGroups(Optional Query As String = "(&(objectClass=group) (samAccountName=*))") As List(Of ADGroup)
+ Return ListGroups(_rootNode, Query)
End Function
-
- Public Function ListGroups(RootNode As DirectoryEntry) As List(Of ADGroup)
+ Public Function ListGroups(RootNode As DirectoryEntry, Optional Query As String = "(&(objectClass=group) (samAccountName=*))") As List(Of ADGroup)
Dim oGroups As New List(Of ADGroup)
Try
- Dim oFilterQuery As String = "(&(objectClass=group) (samAccountName=*))"
Dim oDirectorySearcher As New DirectorySearcher(RootNode) With {
.SearchScope = SearchScope.Subtree,
.SizeLimit = SEARCH_LIMIT,
- .Filter = oFilterQuery
+ .Filter = Query
}
Dim oResults As SearchResultCollection = oDirectorySearcher.FindAll()
@@ -95,6 +159,144 @@ Public Class ActiveDirectoryInterface
End Try
End Function
+ Public Function ListUsers(GroupName As String) As List(Of ADUser)
+ Dim oUsers As New List(Of ADUser)
+
+ Try
+ Using oContext As New PrincipalContext(ContextType.Domain)
+ Using oGroupPrincipal As GroupPrincipal = GroupPrincipal.FindByIdentity(oContext, IdentityType.Name, GroupName)
+ If oGroupPrincipal Is Nothing Then
+ _logger.Warn("Group {0} does not exist.", GroupName)
+ Return oUsers
+ End If
+
+ Using oMembers = oGroupPrincipal.GetMembers(True)
+ For Each oMember As Principal In oMembers
+ If TypeOf oMember Is UserPrincipal Then
+ Dim oUser As UserPrincipal = DirectCast(oMember, UserPrincipal)
+
+ oUsers.Add(New ADUser() With {
+ .GUID = oUser.Guid,
+ .SId = oUser.Sid,
+ .samAccountName = oUser.SamAccountName,
+ .Surname = oUser.Surname,
+ .Middlename = oUser.MiddleName,
+ .GivenName = oUser.GivenName,
+ .Email = oUser.EmailAddress
+ })
+ End If
+ Next
+ End Using
+ End Using
+ End Using
+
+ Return oUsers
+ Catch ex As Exception
+ _logger.Error(ex)
+ Throw ex
+ End Try
+ End Function
+ Public Function ListUsers(GroupNames As List(Of String)) As List(Of ADUser)
+ Try
+ Dim oUsers As New List(Of ADUser)
+ Dim oComparer As New UserEqualityComparer()
+
+ For Each oGroup In GroupNames
+ Dim oGroupUsers = ListUsers(oGroup)
+ Dim oNewUsers = oGroupUsers.
+ Except(oUsers, oComparer).
+ ToList()
+ oUsers.AddRange(oNewUsers)
+ Next
+
+ Return oUsers
+ Catch ex As Exception
+ _logger.Error(ex)
+ Throw ex
+ End Try
+ End Function
+
+ Public Function GetGroupId(GroupName As String) As Integer
+ Try
+ Dim oSQL As String = $"SELECT FNICM_GET_RECORD4SYSKEY('{GroupName}','002-NAME') from RDB$DATABASE"
+ Dim oGroupId = _firebird.GetScalarValue(oSQL)
+
+ If IsDBNull(oGroupId) OrElse oGroupId = 0 Then
+ _logger.Debug("Group {0} not found in database", GroupName)
+ Return Nothing
+ End If
+
+ Return oGroupId
+ Catch ex As Exception
+ _logger.Error(ex)
+ Throw ex
+ End Try
+ End Function
+
+ Private Function GetUserId(UserName As String) As Integer
+ Try
+ Dim oSQL As String = $"SELECT FNICM_GET_RECORD4SYSKEY('{UserName}','001-USRNAME') from RDB$DATABASE"
+ Dim oResult = _firebird.GetScalarValue(oSQL)
+
+ If IsDBNull(oResult) Then
+ Return Nothing
+ End If
+
+ Return oResult
+ Catch ex As Exception
+ _logger.Error(ex)
+ Throw ex
+ End Try
+ End Function
+
+ Private Function CreateUser(User As ADUser) As Int64
+ Try
+ Dim oSQL = $"SELECT FNICM_RADM_NEW_USER('{User.GivenName}', '{User.Surname}', '{User.samAccountName}', 'AD-Sync') from RDB$DATABASE"
+ Dim oUserId As Integer = _firebird.GetScalarValue(oSQL)
+
+ Return oUserId
+ Catch ex As Exception
+ _logger.Error(ex)
+ Throw ex
+ End Try
+ End Function
+
+ Private Function AddUserToGroup(UserId As Integer, GroupId As Integer) As Int64
+ Try
+ Dim oSQL = $"SELECT FNICM_RADM_NEW_USER2GROUP({UserId}, {GroupId}, 'AD-Sync') from RDB$DATABASE"
+ Dim oRecordId = _firebird.GetScalarValue(oSQL)
+
+ If IsDBNull(oRecordId) Then
+ _logger.Warn("UserId {0} - GroupId {1} relation already exists.", UserId, GroupId)
+ Return Nothing
+ End If
+
+ Return oRecordId
+ Catch ex As Exception
+ _logger.Error(ex)
+ Throw ex
+ End Try
+ End Function
+
+ Private Function GetRootNode() As DirectoryEntry
+ Dim oEntry As New DirectoryEntry(_rootPath) With {
+ .AuthenticationType = AuthenticationTypes.Secure,
+ .Password = Nothing,
+ .Username = Nothing
+ }
+
+ Return oEntry
+ End Function
+ Private Function GetRootNode(Username As String, Password As String) As DirectoryEntry
+ Dim oEntry As New DirectoryEntry(_rootPath) With {
+ .AuthenticationType = AuthenticationTypes.Secure,
+ .Password = Username,
+ .Username = Password
+ }
+
+ Return oEntry
+ End Function
+
Private Function GroupResultsToList(Results As SearchResultCollection) As List(Of ADGroup)
Dim oGroups As New List(Of ADGroup)
diff --git a/Modules.Interfaces/ActiveDirectoryInterface/ActiveDirectoryUser.vb b/Modules.Interfaces/ActiveDirectoryInterface/ActiveDirectoryUser.vb
new file mode 100644
index 00000000..4c4840a7
--- /dev/null
+++ b/Modules.Interfaces/ActiveDirectoryInterface/ActiveDirectoryUser.vb
@@ -0,0 +1,18 @@
+Imports System.Security.Principal
+
+Public Class ADUser
+ Public GUID As Guid
+ Public SId As SecurityIdentifier
+ Public samAccountName As String
+ Public Surname As String
+ Public GivenName As String
+ Public Middlename As String
+ Public Email As String
+
+ Public Overrides Function Equals(obj As Object) As Boolean
+ Return DirectCast(obj, ADUser).samAccountName
+ End Function
+ Public Overrides Function ToString() As String
+ Return samAccountName
+ End Function
+End Class
diff --git a/Modules.Interfaces/ActiveDirectoryInterface/UserEqualityComparer.vb b/Modules.Interfaces/ActiveDirectoryInterface/UserEqualityComparer.vb
new file mode 100644
index 00000000..873e05cc
--- /dev/null
+++ b/Modules.Interfaces/ActiveDirectoryInterface/UserEqualityComparer.vb
@@ -0,0 +1,19 @@
+Imports DigitalData.Modules.Interfaces
+
+Public Class UserEqualityComparer
+ Implements IEqualityComparer(Of ADUser)
+
+ Public Overloads Function Equals(x As ADUser, y As ADUser) As Boolean Implements IEqualityComparer(Of ADUser).Equals
+ If ReferenceEquals(x, y) Then Return True
+ If x Is Nothing Or y Is Nothing Then Return False
+
+ Return x.SId = y.SId
+ End Function
+
+ Public Overloads Function GetHashCode(obj As ADUser) As Integer Implements IEqualityComparer(Of ADUser).GetHashCode
+ If obj Is Nothing Then Return 0
+
+ Dim oHashCode = obj.SId.GetHashCode()
+ Return oHashCode
+ End Function
+End Class
diff --git a/Modules.Interfaces/Interfaces.vbproj b/Modules.Interfaces/Interfaces.vbproj
index 5da6ef29..153c34b7 100644
--- a/Modules.Interfaces/Interfaces.vbproj
+++ b/Modules.Interfaces/Interfaces.vbproj
@@ -51,6 +51,7 @@
+
@@ -75,6 +76,8 @@
+
+
@@ -118,6 +121,10 @@
+
+ {EAF0EA75-5FA7-485D-89C7-B2D843B03A96}
+ Database
+
{903B2D7D-3B80-4BE9-8713-7447B704E1B0}
Logging
diff --git a/SERVICES/DDEDM_NetworkService/EDMService.vb b/SERVICES/DDEDM_NetworkService/EDMService.vb
index 5e5f7157..24350966 100644
--- a/SERVICES/DDEDM_NetworkService/EDMService.vb
+++ b/SERVICES/DDEDM_NetworkService/EDMService.vb
@@ -146,7 +146,7 @@ Public Class EDMService
Dim oExtension As String = Path.GetExtension(FileName).Substring(1)
_logger.Debug("File extension of file {0} is {1}", FileName, oExtension)
- Dim oSQL = $"SELECT FNICM_NEW_DOC('{FileName}','{oExtension}','{oContainerId}','{GetContainerName(oContainerId)}','{_username}') FROM RDB$DATABASE;"
+ Dim oSQL = $"SELECT FNICM_NEW_DOC('010', '{oContainerId}', '{GetContainerName(oContainerId)}', '{FileName}', '{oExtension}', '{_username}') FROM RDB$DATABASE;"
Dim oDocId As Int64 = Database.GetScalarValue(oSQL)
If oDocId = -1 Then
diff --git a/ZUGFeRDTest/Form1.vb b/ZUGFeRDTest/Form1.vb
index 982ac191..d1135a30 100644
--- a/ZUGFeRDTest/Form1.vb
+++ b/ZUGFeRDTest/Form1.vb
@@ -5,6 +5,7 @@ Imports System.Xml
Imports DigitalData.Modules
Imports DigitalData.Modules.Database
Imports DigitalData.Modules.Interfaces
+Imports DigitalData.Modules.Jobs
Imports DigitalData.Modules.Jobs.ImportZUGFeRDFiles
Imports DigitalData.Modules.Logging