diff --git a/app/DD-Record-Organizer/ClassDOC_SEARCH.vb b/app/DD-Record-Organizer/ClassDOC_SEARCH.vb index f3a672d..4c747cc 100644 --- a/app/DD-Record-Organizer/ClassDOC_SEARCH.vb +++ b/app/DD-Record-Organizer/ClassDOC_SEARCH.vb @@ -443,40 +443,57 @@ Public Class ClassDOC_SEARCH Return False End Try End Function - Public Shared Function SET_WD_RIGHTS(ByVal RESULT_DOCID, ByVal RESULT_DOC_PATH, ByVal ENTITY_ID) + Public Shared Function SET_WD_RIGHTS(ByVal RESULT_DOCID, ByVal RESULT_DOC_PATH) Try If CURRENT_RECORD_ID = 0 Then MsgBox("No Record selected - Please select one!", MsgBoxStyle.Exclamation) Return False End If - If LogErrorsOnly = False Then ClassLogger.Add("#### SETTING RIGHTS FPOR FILE ######", False) - DD_Rights.clsLogger.Init(Application.UserAppDataPath() & "\Log", USER_USERNAME) - If DD_Rights.clsDatabase.Init(MyConnectionString) = True Then - If DD_Rights.ClassRights.Init(ENTITY_ID, LogErrorsOnly) = True Then - If DD_Rights.ClassRights.Collect_Users(CURRENT_RECORD_ID, ENTITY_ID) = True Then - If DD_Rights.ClassRights.File_DeleteAndSetRight(RESULT_DOCID, RESULT_DOC_PATH, True) Then - If DD_Rights.ClassRights.MSG_RESULT <> "" Then - Dim msg = "Achtung: einige Rechte konnten nicht gesetzt werden: " & vbNewLine & DD_Rights.ClassRights.MSG_RESULT - If USER_LANGUAGE <> "de-DE" Then - msg = "Attention: some rights could not be set: " & vbNewLine & DD_Rights.ClassRights.MSG_RESULT - End If - MsgBox(msg, MsgBoxStyle.Exclamation) - Return True - Else - Return True - End If - Else - Return False + If LogErrorsOnly = False Then ClassLogger.Add("#### SETTING RIGHTS FOR FILE ######", False) + If ClassWDRights.Init = True Then + If ClassWDRights.Doc_Renew_Rights(RESULT_DOCID, RESULT_DOC_PATH, True) Then + If ClassWDRights.MSG_RESULT <> "" Then + Dim msg = "Achtung: einige Rechte konnten nicht gesetzt werden: " & vbNewLine & ClassWDRights.MSG_RESULT.MSG_RESULT + If USER_LANGUAGE <> "de-DE" Then + msg = "Attention: some rights could not be set: " & vbNewLine & ClassWDRights.MSG_RESULT.MSG_RESULT End If - Else - Return False + ClassHelper.MSGBOX_Handler("INFO", "Information:", msg) End If + Return True Else Return False End If Else + MsgBox("Could no initialize right-module - Check the log!", MsgBoxStyle.Exclamation) Return False End If + 'DD_Rights.clsLogger.Init(Application.UserAppDataPath() & "\Log", USER_USERNAME) + 'If DD_Rights.clsDatabase.Init(MyConnectionString) = True Then + ' If DD_Rights.ClassRights.Init(ENTITY_ID, LogErrorsOnly) = True Then + ' If DD_Rights.ClassRights.Collect_Users(CURRENT_RECORD_ID, ENTITY_ID) = True Then + ' If DD_Rights.ClassRights.File_DeleteAndSetRight(RESULT_DOCID, RESULT_DOC_PATH, True) Then + ' If DD_Rights.ClassRights.MSG_RESULT <> "" Then + ' Dim msg = "Achtung: einige Rechte konnten nicht gesetzt werden: " & vbNewLine & DD_Rights.ClassRights.MSG_RESULT + ' If USER_LANGUAGE <> "de-DE" Then + ' msg = "Attention: some rights could not be set: " & vbNewLine & DD_Rights.ClassRights.MSG_RESULT + ' End If + ' MsgBox(msg, MsgBoxStyle.Exclamation) + ' Return True + ' Else + ' Return True + ' End If + ' Else + ' Return False + ' End If + ' Else + ' Return False + ' End If + ' Else + ' Return False + ' End If + 'Else + ' Return False + 'End If Catch ex As Exception MsgBox("Unexpected Error in SET_WD_RIGHTS: " & vbNewLine & ex.Message, MsgBoxStyle.Critical) Return False diff --git a/app/DD-Record-Organizer/ClassWDRights.vb b/app/DD-Record-Organizer/ClassWDRights.vb new file mode 100644 index 0000000..0c3f7b7 --- /dev/null +++ b/app/DD-Record-Organizer/ClassWDRights.vb @@ -0,0 +1,326 @@ +Imports WINDREAMLib +Public Class ClassWDRights +#Region "+++++ Konstanten +++++" + Const REL_Document_AccessRight = "AccessRight" + Const COL_AccessRight_AccessRightID = "dwAccessRightID" + Const COL_AccessRight_AccessRight = "dwAccessRight" + Const REL_AccessRight_UserOrGroup = "AccessRightUserOrGroup" + + + Const WMAccessRightUndefined = 0 + Const WMAccessRightRead = 1 + Const WMAccessRightWrite = 2 + Const WMAccessRightReadWrite = 3 + Const WMAccessRightAdmin = 4 + Const WMAccessRightAllRights = 7 ' doc+folder: read, write and admin access + + Const WMUserTypeMain = 1 + Const WMUserTypeNormal = 4 + Const WMUserTypeInactive = 8 + + Const WMGroupTypeAdmin = 2 + + Const WMEntityGroups = 13 + Const WMEntityUser = 18 + Const WMGroupTypeAll = 127 + +#End Region +#Region "+++++ Variables +++++" + Public Shared AD_DOMAIN As String + Public Shared AD_USER As String + Public Shared AD_USER_PW As String + Public Shared AD_SERVER As String + Public Shared WD_RIGHT_ADMIN As Integer + Public Shared MSG_RESULT = "" +#End Region + Public Shared Function Init() + Try + MSG_RESULT = "" + If LogErrorsOnly = False Then ClassLogger.Add(String.Format(" >> Init ClassWDRights started - " & Now & " ..."), False) + Dim DT_KONFIG As DataTable = ClassDatabase.Return_Datatable("SELECT * FROM TBPMO_SERVICE_RIGHT_CONFIG WHERE GUID = 1") + AD_DOMAIN = DT_KONFIG.Rows(0).Item("AD_DOMAIN") + AD_USER = DT_KONFIG.Rows(0).Item("AD_USER") + WD_RIGHT_ADMIN = DT_KONFIG.Rows(0).Item("WD_RIGHT") + AD_SERVER = DT_KONFIG.Rows(0).Item("AD_SERVER") + Dim PWplainText As String + Dim wrapper As New ClassEncryption("!35452didalog=") + ' DecryptData throws if the wrong password is used. + Try + PWplainText = wrapper.DecryptData(DT_KONFIG.Rows(0).Item("AD_USER_PW")) + Catch ex As Exception + ClassLogger.Add("The Userpassword could not be decrypted", False) + PWplainText = "" + End Try + AD_USER_PW = PWplainText + + If LogErrorsOnly = False Then ClassLogger.Add(String.Format(" >> ClassWDRights Init'ed - AD_DOMAIN: '{0}', AD_USER: '{1}', AD_SERVER: '{2}'", AD_DOMAIN, AD_USER, AD_SERVER), False) + Return True + Catch ex As Exception + ClassLogger.Add("Unexpected Error in ClassRights Init: " & vbNewLine & ex.Message, True) + Return False + End Try + End Function + '''Renews all rights of the passed doc-file + ''' + ''' Returns Boolean True when successfull + ''' + Public Shared Function Doc_Renew_Rights(doc_id As Integer, docpath As String, deleterights As Boolean) As Boolean + Try + If LogErrorsOnly = False Then ClassLogger.Add(String.Format(" >> Working on rights for file: {0}", docpath), False) + Dim DT_USER_RIGHT As DataTable + Dim oSession + Dim oWMObject As WINDREAMLib.WMObject + Dim UserGroupRelation + Dim UserOrGroup + Dim oUSer + Try + 'Dedizierte Session herstellen + oSession = GetWMSessionAsUser(AD_DOMAIN, AD_SERVER, AD_USER, AD_USER_PW) + Catch ex As Exception + Dim msg = "Error in Doc_Renew_Rights-GetWMSessionAsUser : " & ex.Message + ClassLogger.Add(msg, True) + Return False + End Try + + If Not IsNothing(oSession) Then + If LogErrorsOnly = False Then ClassLogger.Add(" >> Session created.", False) + Dim sql = String.Format("SELECT * FROM [dbo].[FNPMO_GET_RIGHTS_FOR_DOC] ({0})", doc_id) + DT_USER_RIGHT = ClassDatabase.Return_Datatable(sql) + If IsNothing(DT_USER_RIGHT) Then + Dim msg = "Error while receiving rights for DocID" + ClassLogger.Add(msg, True) + Return False + End If + Try + 'Object definieren + oWMObject = oSession.GetWMObjectByPath(0, docpath.Substring(2)) + If LogErrorsOnly = False Then ClassLogger.Add(" >> Object created.", False) + Catch ex As Exception + Dim msg = "Error GetWMObjectByPath: (FDSR) " & docpath.Substring(2) & vbNewLine & Err.Description + ClassLogger.Add(msg, True) + Return False + End Try + Dim lret + Try + ' Objekt muss zur Rechteänderung gelockt werden + lret = oWMObject.LockRights() + Catch ex As Exception + Dim msg = "Error while locking file" & ex.Message + ClassLogger.Add(msg, True) + Return False + End Try + + If LogErrorsOnly = False Then ClassLogger.Add(" >> Object locked.", False) + If CBool(lret) = False Then + Dim msg = "Error in setting lock .LockRights - Err.Number: " & Err.Number & vbCrLf & Err.Description + ClassLogger.Add(msg, True) + Return False + End If + + ' Rechteträger-Liste holen + Dim AccessRights + AccessRights = oWMObject.GetWMObjectRelationByName(REL_Document_AccessRight) + If LogErrorsOnly = False Then ClassLogger.Add(" >> AccessRights created.", False) + 'Bei Fehler in Rechteauswertung + If Err.Number <> 0 Then + Dim msg = "Error in setting REL_Document_AccessRight - Err.Number: " & Err.Number & vbCrLf & Err.Description + ClassLogger.Add(msg, True) + Return False + End If + '############################# Rechte löschen ################################################################################ + '############################################################################################################################# + If deleterights = True Then + If LogErrorsOnly = False Then ClassLogger.Add(" >> rights for document will now be deleted.", False) + 'Erst einmal alle anderen Rechte löschen + Dim i As Integer = 1 + ' und nun jeden Rechteträger verarbeiten + For Each aRightRelation In AccessRights + + ' Auflistung der Rechteträger-Informationen holen + UserGroupRelation = aRightRelation.GetWMObjectRelationByName(REL_AccessRight_UserOrGroup) + If Err.Number <> 0 Then + Dim msg = "Error in setting REL_AccessRight_UserOrGroup - Err.Number: " & Err.Number & vbCrLf & Err.Description + ClassLogger.Add(msg, True) + Return False + End If + + ' Zugriff auf das Benutzer/Gruppen-Objekt + UserOrGroup = UserGroupRelation.item(0) + Dim _msg As String + + If (UserOrGroup.aWMEntity = WMEntityGroups) Then + _msg = "Right for Group '" & UserOrGroup.aName & "'""" + Else + _msg = "Right for User: '" & UserOrGroup.aName & "'""" + End If + If LogErrorsOnly = False Then ClassLogger.Add(String.Format(" >> {0} will now be deleted.", _msg), False) + If Err.Number <> 0 Then + Dim msg = "Error in setting UserGroupRelation - Err.Number: " & Err.Number & vbCrLf & Err.Description + ClassLogger.Add(msg, True) + Return False + End If + + 'einem Rechteträger ALLE Rechte zu entziehen + 'entfernt ihn gleichzeitig aus der Auflistung der Rechteträger + Try + AccessRights.Delete2(UserOrGroup, WMAccessRightAllRights) + Catch ex As Exception + Dim msg = "Error in AccessRights.Delete2: " & ex.Message + ClassLogger.Add(msg, True) + Continue For + End Try + i += 1 + _msg = _msg.Replace("'", "") + If LogErrorsOnly = False Then ClassLogger.Add(String.Format(" >> {0} was deleted.", _msg), False) + Next + If LogErrorsOnly = False Then ClassLogger.Add(" >> All rights for doc were deleted....", False) + End If + + Err.Clear() + ' Wenn ALLE Rechteträger entfernt werden (FOR EACH), + ' dann muss mindestens EIN Rechteträger mit dem Recht zur Rechteänderung + ' wieder zugefügt werden!!!!! Dies ist der ADDI-Right User! + 'Für jeden User das Recht einzeln hinzufügen + For Each User_Row As DataRow In DT_USER_RIGHT.Rows + Dim fileright 'Recht als Integer + Dim StringUserRight + Try + StringUserRight = AD_DOMAIN & "\" & User_Row.Item("USR_NAME") + fileright = User_Row.Item("USR_RIGHT") + If LogErrorsOnly = False Then ClassLogger.Add(String.Format(" >> Working on right for user-right: {0}-{1}", StringUserRight, fileright), False) + Try + ' User holen + oUSer = oSession.GetWMObjectByName(WMEntityUser, StringUserRight) + If LogErrorsOnly = False Then ClassLogger.Add(" >> got oUSer...", False) + Catch ex As Exception + Dim msg = String.Format(">> Could not create windream-Usersession for user '{0}' - check whether user is part of windream-group!", StringUserRight) + ClassLogger.Add(msg, False) + MSG_RESULT &= msg & vbNewLine + Continue For + End Try + If Not IsNothing(oUSer) Then + Try + AccessRights.Insert2(oUSer, fileright) 'WMAccessRightAllRights) + If LogErrorsOnly = False Then ClassLogger.Add(" >> Right was set...", False) + Catch ex As Exception + Dim msg = String.Format(">> Could not set right for user {0} - AccessRights.Insert2: {1}", StringUserRight, ex.Message) + ClassLogger.Add(msg, True) + Continue For + End Try + End If + + Catch ex As Exception + Dim _right + Select Case fileright + Case WMAccessRightRead + _right = "READ" + Case WMAccessRightWrite + _right = "WRITE" + Case WMAccessRightAdmin + _right = "ADMIN" + Case WMAccessRightAllRights + _right = "ALL RIGHTS" + Case WMAccessRightReadWrite + _right = "READ WRITE" + End Select + MSG_RESULT &= String.Format("Error while working on RightChange:" & vbNewLine & "Fileright: {0}" & vbNewLine & "User: {1} " & vbNewLine & "File: {2}", _right, StringUserRight, docpath) & vbNewLine + ClassLogger.Add(ex.Message) + End Try + Next + Try + 'Speichern nicht vergessen + oWMObject.Save() + If LogErrorsOnly = False Then ClassLogger.Add(" >> Doc was saved...", False) + Catch ex As Exception + Dim msg = String.Format("Error at Object2Change.Save - DocID ({0}): {1}", doc_id, ex.Message) + ClassLogger.Add(msg, True) + If oWMObject.aLocked = True Then + oWMObject.unlock() + If LogErrorsOnly = False Then ClassLogger.Add(" >> Doc unlocked after error!", False) + End If + Return False + End Try + + 'und der Vollständigkeit halber auch ein Unlock + If oWMObject.aLocked = True Then + Try + oWMObject.unlock() + If LogErrorsOnly = False Then ClassLogger.Add(" >> Doc was unlocked...", False) + Catch ex As Exception + Dim msg = "Fehler bei Unlock - Error: " & ex.Message + ClassLogger.Add(msg, True) + Return False + End Try + End If + ClassHelper.InsertEssential_Log(doc_id, "DOC-ID", "Rights for doc successfully renewed - Doc_Renew_Rights") + 'jetzt True zurückgeben + Return True + Else + Dim msg = "ERROR : no session could be created (3)!" + ClassLogger.Add(msg, True) + Return False + End If + Catch ex As Exception + ClassLogger.Add(String.Format("Unexpected Error while Doc_Renew_Rightss DocID: {0}", doc_id), True) + Dim msg = "ErrorMessage: " & vbNewLine & ex.Message + ClassLogger.Add(msg, False) + Return False + End Try + End Function + + Public Shared Function GetWMSessionAsUser(Domain, ServerName, UserName, Password) + Try + Dim SessionAsUser + Dim aConnect, aUserId, aSession + + ' Hilfsobjekte erschaffen, um eine Verbindung zum windream Server herzustellen + ' mit der gewünschten Benutzer-Identität + aConnect = CreateObject("Windream.WMConnect") + 'Bei einer impersonifizierten Session ist zu beachten, dass die ModuleID 9 zu nutzen ist. + 'Wird keine Session-ID angegeben, hat die Session die ID 0 (‚Default‘). + aConnect.ModuleId = 9 + If Err.Number <> 0 Then + Dim msg = "Error in CreateObject (aConnect) - Err.Number: " & Err.Number & vbNewLine & Err.Description + ClassLogger.Add(msg, True) + + SessionAsUser = Nothing + Return SessionAsUser + End If + + aUserId = CreateObject("WMOTool.WMUserIdentity") + If Err.Number <> 0 Then + Dim msg = "Error in CreateObject('WMOTool.WMUserIdentity') - Err.Number: " & Err.Number & vbNewLine & Err.Description + ClassLogger.Add(msg, True) + SessionAsUser = Nothing + Return SessionAsUser + End If + + aUserId.aDomain = Domain + aUserId.aServerName = ServerName + aUserId.aUserName = UserName + aUserId.aPassword = Password + + aSession = aConnect.Login(aUserId) + + + If Err.Number <> 0 Then + Dim msg = "Error in Connect.Login(aUserId) - Err.Number: " & Err.Number & vbNewLine & Err.Description + ClassLogger.Add(msg, True) + SessionAsUser = Nothing + Return SessionAsUser + Else + SessionAsUser = aSession + If aSession.aLoggedin = True Then + Return SessionAsUser + End If + + End If + Catch ex As Exception + Dim msg = "Unexpected Error in DDLibraries-GetWMSessionAsUser: " & ex.Message & vbNewLine & _ + String.Format("Domain: {0}, ServerName: {1}, UserName: {2}, Password: {3},", Domain, ServerName, UserName, Password) + ClassLogger.Add(msg, True) + Return Nothing + End Try + + End Function +End Class diff --git a/app/DD-Record-Organizer/DD-Record-Organizer.vbproj b/app/DD-Record-Organizer/DD-Record-Organizer.vbproj index 2396473..e3d3b1e 100644 --- a/app/DD-Record-Organizer/DD-Record-Organizer.vbproj +++ b/app/DD-Record-Organizer/DD-Record-Organizer.vbproj @@ -273,6 +273,7 @@ + True diff --git a/app/DD-Record-Organizer/frmConstructor_Main.resx b/app/DD-Record-Organizer/frmConstructor_Main.resx index dcc2ea7..56aba0a 100644 --- a/app/DD-Record-Organizer/frmConstructor_Main.resx +++ b/app/DD-Record-Organizer/frmConstructor_Main.resx @@ -2636,7 +2636,7 @@ True - 215 + 25 6, 13 diff --git a/app/DD-Record-Organizer/frmConstructor_Main.vb b/app/DD-Record-Organizer/frmConstructor_Main.vb index a5e6c1d..efde1f8 100644 --- a/app/DD-Record-Organizer/frmConstructor_Main.vb +++ b/app/DD-Record-Organizer/frmConstructor_Main.vb @@ -5641,7 +5641,7 @@ Public Class frmConstructor_Main Dim err As Boolean = False Cursor = Cursors.WaitCursor For Each row As DataRow In ClassWindreamDocGrid.DT_RESULTFILES.Rows - If ClassDOC_SEARCH.SET_WD_RIGHTS(row.Item("DOC_ID"), row.Item("DOC_PATH"), ENTITY_ID) = True Then + If ClassDOC_SEARCH.SET_WD_RIGHTS(row.Item("DOC_ID"), row.Item("DOC_PATH")) = True Then Else err = True diff --git a/app/DD-Record-Organizer/frmWD_IndexFile.vb b/app/DD-Record-Organizer/frmWD_IndexFile.vb index 43866fd..f0eb35d 100644 --- a/app/DD-Record-Organizer/frmWD_IndexFile.vb +++ b/app/DD-Record-Organizer/frmWD_IndexFile.vb @@ -227,18 +227,8 @@ Public Class frmWD_IndexFile If clsWindream.Create_Session() = False Then MsgBox("Could not create a windream-session!", MsgBoxStyle.Critical) Else - If ClassDOC_SEARCH.SET_WD_RIGHTS(CURRENT_DOC_ID, CURRENT_FILEIN_WD, CURRENT_ENTITY_ID) = False Then - MsgBox("The rights for the new file could not be created! Please check the logfile!" & vbNewLine & _ - "ADDI will try to give You at least reading rights!", MsgBoxStyle.Exclamation) - DD_Rights.ClassRights.SetRightExplicit(CURRENT_DOC_ID, CURRENT_FILEIN_WD, USER_USERNAME, 1) - ClassHelper.InsertEssential_Log(CURRENT_DOC_ID, "DOC-ID", "NEW FILE INDEXING - RIGHTS COULD NOT BE SET!!") - End If 'Create Session um Fehler bei windows Session nicht zu erzeugen FAU_AD_USER = "" - - If CURRENT_REDUNDANT_FORM_ID <> 0 Then - ClassDOC_SEARCH.SET_WD_RIGHTS(CURRENT_DOC_ID, CURRENT_FILEIN_WD, CURRENT_REDUNDANT_FORM_ID) - End If ClassFileResult.DocID = CURRENT_DOC_ID ClassFileResult.SET_DOCID_INDICES() If ClassDOC_SEARCH.CREATE_DOC_RELATED_LINKS(CURRENT_DOC_ID, CURRENT_RECORD_ID) = False Then @@ -247,6 +237,16 @@ Public Class frmWD_IndexFile stg = "Unexpected Error: Could not create the recordlink! Please check the log." End If MsgBox(stg, MsgBoxStyle.Critical, stg1) + Else + 'If CURRENT_REDUNDANT_FORM_ID <> 0 Then + ' ClassDOC_SEARCH.SET_WD_RIGHTS(CURRENT_DOC_ID, CURRENT_FILEIN_WD) + 'End If + If ClassDOC_SEARCH.SET_WD_RIGHTS(CURRENT_DOC_ID, CURRENT_FILEIN_WD) = False Then + MsgBox("The rights for the new file could not be created! Please check the logfile!" & vbNewLine & _ + "ADDI will try to give You at least reading rights!", MsgBoxStyle.Exclamation) + DD_Rights.ClassRights.SetRightExplicit(CURRENT_DOC_ID, CURRENT_FILEIN_WD, USER_USERNAME, 1) + ClassHelper.InsertEssential_Log(CURRENT_DOC_ID, "DOC-ID", "NEW FILE INDEXING - RIGHTS COULD NOT BE SET!!") + End If End If End If