Prepare Data History Provider 2.7 integration update

- modularize Citrix and agent integrations and add remote desktop endpoints
- extend ticket overview, ticket links, token validation, and staged relation handling
- update configuration, licensing, project, signing, and publish artifacts
This commit is contained in:
Meik
2026-07-20 09:31:52 +02:00
parent a3357e2a36
commit ccc48c521a
62 changed files with 5267 additions and 2521 deletions

View File

@@ -149,6 +149,9 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\..\C4IT FASD\_Common\C4IT.F4SD.Base.Ticket.cs">
<Link>Common\C4IT.F4SD.Base.Ticket.cs</Link>
</Compile>
<Compile Include="..\..\C4IT FASD\_Common\C4IT.F4SD.GlobalConfig.cs">
<Link>Common\C4IT.F4SD.GlobalConfig.cs</Link>
</Compile>
@@ -254,9 +257,6 @@
<Compile Include="..\F4SD-Cockpit-ServerCore\DataHistoryCollectorActiveDirectory.cs">
<Link>DataHistoryCollectorActiveDirectory.cs</Link>
</Compile>
<Compile Include="..\F4SD-Cockpit-ServerCore\DataHistoryCollectorCitrix.cs">
<Link>DataHistoryCollectorCitrix.cs</Link>
</Compile>
<Compile Include="..\F4SD-Cockpit-ServerCore\DataHistoryCollectorClientAgent.cs">
<Link>DataHistoryCollectorClientAgent.cs</Link>
</Compile>
@@ -275,9 +275,6 @@
<Compile Include="..\F4SD-Cockpit-ServerCore\DataHistoryConfigActiveDirectory.cs">
<Link>DataHistoryConfigActiveDirectory.cs</Link>
</Compile>
<Compile Include="..\F4SD-Cockpit-ServerCore\DataHistoryConfigCitrix.cs">
<Link>DataHistoryConfigCitrix.cs</Link>
</Compile>
<Compile Include="..\F4SD-Cockpit-ServerCore\DataHistoryConfigClientAgent.cs">
<Link>DataHistoryConfigClientAgent.cs</Link>
</Compile>
@@ -302,6 +299,9 @@
<Compile Include="..\F4SD-Cockpit-ServerCore\DataHistorySqlHelper.cs">
<Link>DataHistorySqlHelper.cs</Link>
</Compile>
<Compile Include="..\F4SD-Cockpit-ServerCore\DataSources\IRemoteDesktopManager.cs">
<Link>DataSources\IRemoteDesktopManager.cs</Link>
</Compile>
<Compile Include="..\F4SD-Cockpit-ServerCore\DataSources\ISearchResultRelationProvider.cs">
<Link>DataSources\ISearchResultRelationProvider.cs</Link>
</Compile>
@@ -314,6 +314,27 @@
<Compile Include="..\F4SD-Cockpit-ServerCore\IisConfigHelper.cs">
<Link>IisConfigHelper.cs</Link>
</Compile>
<Compile Include="..\F4SD-Cockpit-ServerCore\Modules\Agent\AgentApiHandler.cs">
<Link>Modules\Agent\AgentApiHandler.cs</Link>
</Compile>
<Compile Include="..\F4SD-Cockpit-ServerCore\Modules\Agent\AgentRemoteClientInfo.cs">
<Link>Modules\Agent\AgentRemoteClientInfo.cs</Link>
</Compile>
<Compile Include="..\F4SD-Cockpit-ServerCore\Modules\Agent\AgentRemoteConnectionInfo.cs">
<Link>Modules\Agent\AgentRemoteConnectionInfo.cs</Link>
</Compile>
<Compile Include="..\F4SD-Cockpit-ServerCore\Modules\Agent\AgentRemoteDesktopManager.cs">
<Link>Modules\Agent\AgentRemoteDesktopManager.cs</Link>
</Compile>
<Compile Include="..\F4SD-Cockpit-ServerCore\Modules\Agent\DTOs\AgentLogonResultDto.cs">
<Link>Modules\Agent\DTOs\AgentLogonResultDto.cs</Link>
</Compile>
<Compile Include="..\F4SD-Cockpit-ServerCore\Modules\Citrix\DataHistoryCollectorCitrix.cs">
<Link>Modules\Citrix\DataHistoryCollectorCitrix.cs</Link>
</Compile>
<Compile Include="..\F4SD-Cockpit-ServerCore\Modules\Citrix\DataHistoryConfigCitrix.cs">
<Link>Modules\Citrix\DataHistoryConfigCitrix.cs</Link>
</Compile>
<Compile Include="..\F4SD-Cockpit-ServerCore\Services\IStagedRelationService.cs">
<Link>Services\IStagedRelationService.cs</Link>
</Compile>

View File

@@ -14,9 +14,13 @@
<TicketConfiguration>
<DisableAutomaticTimeTracking Policy="Mandatory" Value="true" />
<CompletitionPolicy Policy="Mandatory" Value="IfRequired" />
<CompletitionPolicy Policy="Mandatory" Value="ifRequired" />
<NotesMandatory Policy="Mandatory" Value="true" />
<ShowOverview Policy="Mandatory" Value="false" />
<TicketProcessing Policy="Mandatory" Value="extern">
<TicketTypeProcessing Type="Incident" Value ="intern"/>
<TicketTypeProcessing Type="UnclassifiedTicket" Value ="both" />
</TicketProcessing>
<OpenActivitiesExternally Policy="Mandatory" Value="false">
<OpenActivityOverride ActivityType="SPSActivityTypeTicket" Value="false" />
<OpenActivityOverride ActivityType="SPSActivityTypeServiceRequest" Value="true" />
@@ -24,4 +28,9 @@
<OverviewPollingPersonal Policy="Mandatory" Value="10" />
<OverviewPollingRole Policy="Mandatory" Value="5" />
</TicketConfiguration>
<UseGamification Policy="Hidden" Value="true"/>
<IntuneConfiguration>
<TAPLifeTimeInMinutes Policy="Default" Value="60" />
<TAPIsUsableOnce Policy="Default" Value="true" />
</IntuneConfiguration>
</F4SD-Global-Configuration>

View File

@@ -18,11 +18,29 @@
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TicketTypeEnum">
<xs:restriction base="xs:NCName">
<xs:enumeration value="Ticket"/>
<xs:enumeration value="UnclassifiedTicket"/>
<xs:enumeration value="Incident"/>
<xs:enumeration value="ServiceRequest"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TicketCompletitionPolicyEnum">
<xs:restriction base="xs:NCName">
<xs:enumeration value="ifRequired"/>
<xs:enumeration value="IfRequired"/>
<xs:enumeration value="false"/>
<xs:enumeration value="true"/>
<xs:enumeration value="never"/>
<xs:enumeration value="always"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TicketProcessingEnum">
<xs:restriction base="xs:NCName">
<xs:enumeration value="intern"/>
<xs:enumeration value="extern"/>
<xs:enumeration value="both"/>
</xs:restriction>
</xs:simpleType>
@@ -76,6 +94,14 @@
</xs:element>
<xs:element ref="InformationClassSearchPriority" minOccurs="0" maxOccurs="1"/>
<xs:element ref="TicketConfiguration" minOccurs="0" maxOccurs="1"/>
<xs:element name="UseGamification" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>
<xs:extension base="BoolNode"></xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element ref="IntuneConfiguration" minOccurs="0" maxOccurs="1" />
</xs:all>
</xs:complexType>
</xs:element>
@@ -131,6 +157,22 @@
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="TicketProcessing" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="TicketTypeProcessing" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="Type" type="TicketTypeEnum" use="required"/>
<xs:attribute name="Value" type="TicketProcessingEnum" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="Policy" type="PolicyEnum" use="required"/>
<xs:attribute name="Value" type="TicketProcessingEnum" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="OpenActivitiesExternally" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
@@ -145,6 +187,7 @@
<xs:attribute name="Value" type="xs:boolean" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="OverviewPollingPersonal" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>
@@ -166,5 +209,29 @@
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="IntuneConfiguration">
<xs:complexType>
<xs:all>
<xs:element name="TAPLifeTimeInMinutes" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>
<xs:extension base="PolicyNode">
<xs:attribute name="Value" type="xs:positiveInteger" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="TAPIsUsableOnce" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>
<xs:extension base="BoolNode"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -252,6 +252,9 @@
<NamedParameter ParameterName="IntuneDeviceId" Name="IntuneDeviceId" Display="STRING" ValueTable="intune-deviceInfo" ValueColumn="id">
<Name Lang="DE">IntuneDeviceId</Name>
</NamedParameter>
<NamedParameter ParameterName="EmpirumDeviceId" Name="EmpirumDeviceId" Display="STRING" ValueTable="empirum-deviceInfo" ValueColumn="id">
<Name Lang="DE">EmpirumDeviceId</Name>
</NamedParameter>
<NamedParameter ParameterName="BshRegistryKeyExists" Name="BshRegistryKeyExists" Display="STRING" ValueTable="Computation_BshRegistryKeyExists" ValueColumn="default">
<Name Lang="DE">BshRegistryKeyExists</Name>
</NamedParameter>
@@ -891,6 +894,21 @@
<State-Link Reference="UserJobTitle" />
<State-Info Name="Manager" ValueTable="Computation_ManagerFilter" ValueColumn="default" />
</StateCategory>
<StateCategory Name="empirumInformationWidget">
<State-Info Name="Empirum Info" ValueTable="Computation_EmptyConstant" ValueColumn="default">
<Name Lang="DE">Empirum Informationen</Name>
</State-Info>
<State-Info Name="Empirum Id" ValueTable="empirum-deviceInfo" ValueColumn="Id">
<Name Lang="DE">Empirum Id</Name>
</State-Info>
<State-Info Name="LastInventory" ValueTable="empirum-deviceInfo" Display="DATETIME" ValueColumn="LastInventory">
<Name Lang="DE">Letzte Inventory</Name>
</State-Info>
<State-Info Name="IsPxe" ValueTable="empirum-deviceInfo" ValueColumn="IsPxe">
<Name Lang="DE">IsPxe</Name>
</State-Info>
</StateCategory>
<StateCategory Name="deviceInformationWidget">
<State-Link Reference="FullDeviceModelName" />
<State-Info Name="Serial number" ValueTable="agnt-computer" ValueColumn="SerialNumber">
@@ -1372,7 +1390,7 @@
</CategoriesStatic-Slim>
<CategoriesHistory />
</HealthCard>
<HealthCard Name="DefaultVirtualSession" InformationClass="VirtualSession">
<HealthCard Name="DefaultVirtualSession" InformationClass="VirtualSession" DefaultCopyTemplate="Ticket Information-VM">
<NamedParameters>
<NamedParameter ParameterName="VirtualSessionName" Name="Session name" Display="STRING" ValueTable="Computation_DomainRegEx" ValueColumn="default">
<Name Lang="DE">Session</Name>

View File

@@ -7,7 +7,8 @@
<Credential Name="NXT" Domain="" User="tusr_nxt_collector@c4it.intra">R0ICvoG+yjJFGXGgagNQbzAwcBacJr47wRHOIwYhBl/YGDmxpoRWrI1GZ9x1C7ofSqeE1UeZNHX/oqMo/04h+jfUrqk1QHo/6e43Lns1z7UVhWrzOlPSxYwCjv7e4+6wqTWTx6UNGR5jCeD/eHAXHW24dGu7mph9xhcB3VC1kRY=</Credential>
<Credential Name="NXCLOUD" Domain="" User="sd002">ZLAAU+jFXU/+x9FVjx4EAZRnK/D+G/OpZGkn4ek56vhDUeoR5QnSAsNu/cMa1yM3Zxa3CgmSjUmpBy+X2gr1Vo8yAeLVhqI8k9hzev+/LhrinTZIqVZZ4CaA5TEiBuNAy2uB8WEkned6uh3hRyIVNavlfoO9sToZn8f+xn8NKrM=</Credential>
<Credential Name="AGENTAPI" Domain="" User="management-client">gdZccNCwzFrAdA+qGOA9I9ChD8hJQq/4Xuc5iC2i2I+Rtp6KCRrlgqPU0Wn6zwQ8SKitRLUSeNCJcspzkpewfv0Lnb2VIDMhdDeA5zyxVss0dZqDrMgYRhZcT+odtFTX8GlWUTyqBSQpUh8YQYdggvFZkE5ZOTaFU6kqUoKAgcs=</Credential>
<Credential Name="M42API-Demo" Domain="" User="F4SD API Access">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</Credential>
<!--<Credential Name="M42API-Demo" Domain="" User="F4SD API Access">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</Credential>-->
<Credential Name="M42API-Demo-26-1" Domain="" User="F4SD API Access">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</Credential>
<!-- M42 API KEY: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1bmlxdWVfbmFtZSI6ImltYWdvdmVydW0uY29tXFx2dm9nZWwiLCJuYW1laWQiOiJpbWFnb3ZlcnVtLmNvbVxcdnZvZ2VsIiwiVXNlckZyYWdtZW50SWQiOiI3ZWRhYTljNy03YjMzLWU1MTEtODBmNi0wMDUwNTYyZjk1MTYiLCJpc3MiOiJodHRwczovL3N0cy5tYXRyaXg0Mi5jb20iLCJhdWQiOiJ1cm46bWF0cml4NDJBcGkiLCJleHAiOjIxNDc0ODM2MTIsIm5iZiI6MTY2NTU4Mzc3Mn0.MQntDtbSafCY42UDkyEHiSE8VLZX6B_EIkSg04wdrAc-->
<Credential Name="M42API-Demo-Dieter" Domain="" User="F4SD API Access">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</Credential>
<!-- M42 API KEY: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1bmlxdWVfbmFtZSI6ImltYWdvdmVydW0uY29tXFx3c21zZXJ2aWNlcyIsIm5hbWVpZCI6ImltYWdvdmVydW0uY29tXFx3c21zZXJ2aWNlcyIsIlVzZXJGcmFnbWVudElkIjoiYmZlY2IxOWUtY2MwOS1lNTExLWQzODAtMDA1MDU2MmY5NTE2IiwiaXNzIjoiaHR0cHM6Ly9zdHMubWF0cml4NDIuY29tIiwiYXVkIjoidXJuOm1hdHJpeDQyQXBpIiwiZXhwIjoyMTQ3NDgzNjA3LCJuYmYiOjE2ODMwMjI0MDd9.k4lcNXAHQfkRH28MVOZz6cONe794JoZW3wV9A0V7PAQ -->
@@ -81,7 +82,7 @@
</Azure-Tenant>
<!--<Azure-Tenant Domain="sd0024.onmicrosoft.com" TenantID="07362148-410e-4636-a9cb-795fba1a5452" Credential="AzureAccess_Dieter"/>-->
</Azure-AD>
<Matrix42-WPM Server="srvwsm001.imagoverum.com" Credential="M42API-Demo" ClosedTicketHistory="9999" DisplayName="M42 Demo server (imagoverum)" ApiTokenLifetime ="30 days" ActivityQueueFilter="ticketsAndListedQueues">
<Matrix42-WPM Server="srvwsm001.imagoverum.com" Credential="M42API-Demo-26-1" ClosedTicketHistory="9999" DisplayName="M42 Demo server (imagoverum)" ApiTokenLifetime ="30 days" ActivityQueueFilter="showAll">
<Matrix42-Ticket DisableAutomaticTimeTracking="1"
ShowDocumentCaseDialog="ifRequired"/>
<DisplayName Lang="DE">M42 Demo Server (Imagoverum)</DisplayName>

View File

@@ -391,12 +391,18 @@
</xs:complexType>
</xs:element>
<xs:complexType name="CitrixSystemType">
<xs:attribute name="Name" type="xs:string" use="required"/>
<xs:attribute name="SiteID" type="guid" use="optional"/>
<xs:attribute name="Credential" type="xs:NCName" use="required"/>
</xs:complexType>
<xs:element name="Citrix">
<xs:complexType>
<xs:sequence>
<xs:element ref="Scan-Timing" maxOccurs="1" minOccurs="0"/>
<xs:element ref="Citrix-Tenant" maxOccurs="unbounded" minOccurs="1"/>
<xs:element ref="Citrix-Cloud-Tenant" maxOccurs="unbounded" minOccurs="0"/>
<xs:element ref="Citrix-OnPrem-System" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="UniqueCitrixTenants">
@@ -405,14 +411,17 @@
</xs:unique>
</xs:element>
<xs:element name="Citrix-Tenant">
<xs:element name="Citrix-Cloud-Tenant">
<xs:complexType>
<xs:sequence>
</xs:sequence>
<xs:attribute name="Domain" type="xs:string" use="required"/>
<xs:attribute name="TenantID" type="xs:string" use="required"/>
<xs:attribute name="InstanceID" type="guid" use="required"/>
<xs:attribute name="Credential" type="xs:NCName" use="required"/>
<xs:complexContent>
<xs:extension base="CitrixSystemType">
<xs:attribute name="Name" type="xs:string" use="required"/>
<xs:attribute name="Domain" type="xs:string" use="required"/>
<xs:attribute name="TenantID" type="xs:string" use="required"/>
<xs:attribute name="SiteID" type="guid" use="optional"/>
<xs:attribute name="Credential" type="xs:NCName" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:keyref name="CitrixTenantCredentialRef" refer="CredentialId">
<xs:selector xpath="."/>
@@ -420,6 +429,15 @@
</xs:keyref>
</xs:element>
<xs:element name="Citrix-OnPrem-System">
<xs:complexType>
<xs:attribute name="Name" type="xs:string" use="required"/>
<xs:attribute name="Server" type="xs:string" use="required"/>
<xs:attribute name="SiteID" type="guid" use="optional"/>
<xs:attribute name="Credential" type="xs:NCName" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="Active-Directory">
<xs:complexType>
<xs:sequence>

View File

@@ -1,6 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<F4SD-QuickAction-Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="F4SD-QuickAction-Configuration.xsd">
<QuickActions>
<QuickAction-Native NativeName="StartAgentRemoteConnection" RunImmediate="true" Name="Start remote connection" InformationClass="Computer" Id="690777fd-f6fe-4194-bb56-4541b111c11c">
<Name Lang="DE">Remote Verbindung starten</Name>
<Icon IconType="material" Name="ic_leak_add" />
</QuickAction-Native>
<QuickAction-Local-Script InformationClass="Computer" Name="Edit AD computer object" Id="92FC7E6A-FD2C-4DAD-90F5-02C39D0F0D0B" Section="Favourites" Params="-Name &quot;%DeviceName.Value%&quot; -DistinguishedName &quot;%ad-dn-computer.Value%&quot;" StartWithAlternateCredentials="true" RunImmediate="true" CheckFilePath="%System%\dsa.msc">
<Name Lang="DE">AD Computer Objekt bearbeiten</Name>
<Description Lang="EN">Opens Active Directory to edit the current selected computer.</Description>
@@ -933,14 +937,14 @@
</Script>
</QuickAction-Local-Script>
<QuickAction-Server Category="Intune" Action="UpdateComplianceState" Name="Update ComplianceState" ParamaterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="bc98eabc-353f-4866-bab0-681aafe48d7b">
<QuickAction-Server Category="Intune" Action="UpdateComplianceState" Name="Update ComplianceState" ParameterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="bc98eabc-353f-4866-bab0-681aafe48d7b">
<Name Lang="DE">Intune Komformitätsstatus erzwingen</Name>
<Name Lang="EN">Enforce Intune compliance state</Name>
<Description Lang="DE">Komformitätsstatus aktualisieren</Description>
<Description Lang="EN">Update compliance state</Description>
<Icon IconType="material" Name="ic_verified_user" />
</QuickAction-Server>
<QuickAction-Server Category="Intune" Action="GetBitlockerKey" ParamaterType ="deviceId" Name="Get BitlockerKey" InformationClass="Computer" Section ="Intune" Id="5123e4f8-e183-428f-bff1-b3e2afdfc745">
<QuickAction-Server Category="Intune" Action="GetBitlockerKey" ParameterType ="deviceId" Name="Get BitlockerKey" InformationClass="Computer" Section ="Intune" Id="5123e4f8-e183-428f-bff1-b3e2afdfc745">
<Name Lang="DE">Bitlocker Schlüssel anzeigen</Name>
<Name Lang="EN">Show Bitlocker recoverykey</Name>
@@ -956,14 +960,29 @@
<ColumnOutputFormatting ValueName="volumeType" Name="Volume Type" Translation ="bitlocker_volume" Display="STRING">
<Name Lang="DE">Laufwerkstyp</Name>
</ColumnOutputFormatting>
<ColumnOutputFormatting ValueName="createdDateTime" Name="Created date" Display="STRING">
<ColumnOutputFormatting ValueName="createdDateTime" Name="Created date" Display="DATETIME">
<Name Lang="DE">Erstellungsdatum </Name>
</ColumnOutputFormatting>
</ColumnOutputFormattings>
</QuickAction-Server>
</QuickAction-Server>
<QuickAction-Server Category="Intune" Action="GetTAP" ParameterType="userId" Name="Get TAP" InformationClass="User" Section="Intune" Id="44e234d3-cb38-46a3-b0e5-f86372cd2e55">
<Name Lang="DE">TAP Passwort anzeigen</Name>
<Name Lang="EN">Show TAP Password</Name>
<Description Lang="DE">TAP Passwort anzeigen</Description>
<Description Lang="EN">Show TAP Password</Description>
<Icon IconType="material" Name="ic_vpn_key" />
<ColumnOutputFormattings>
<ColumnOutputFormatting ValueName="temporaryAccessPass" Name="Access Pass" Display="STRING" IsSecret="true">
<Name Lang="DE">Passwort</Name>
</ColumnOutputFormatting>
<ColumnOutputFormatting ValueName="startDateTime" Name="Start date" Display="DATETIME">
<Name Lang="DE">Startdatum </Name>
</ColumnOutputFormatting>
</ColumnOutputFormattings>
</QuickAction-Server>
<QuickAction-Server Category="Intune" Action="GetManagedApps" Name="Get Managed Apps" ParamaterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="e798637e-a315-4d88-aec8-e6f22f9f70c7" >
<QuickAction-Server Category="Intune" Action="GetManagedApps" Name="Get Managed Apps" ParameterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="e798637e-a315-4d88-aec8-e6f22f9f70c7" >
<Name Lang="DE">Verwaltete Anwendungen anzeigen</Name>
<Name Lang="EN">Show managed applications</Name>
@@ -996,7 +1015,7 @@
</QuickAction-Local-WebRequest>
<!--<QuickAction-Server Category="Intune" Action="GetLAPS" ParamaterType ="deviceId" Name="Get LAPS" InformationClass="Computer" Section ="Intune" Id="e0446b95-81b6-4a62-82cf-7c14988957ba" >
<!--<QuickAction-Server Category="Intune" Action="GetLAPS" ParameterType ="deviceId" Name="Get LAPS" InformationClass="Computer" Section ="Intune" Id="e0446b95-81b6-4a62-82cf-7c14988957ba" >
<Name Lang="DE">LAPS Passwort anzeigen</Name>
<Name Lang="EN">Show LAPS Password</Name>
@@ -1019,7 +1038,7 @@
</QuickAction-Server>-->
<QuickAction-Server Category="Intune" Action="GetBitlockerKeyTest" ParamaterType ="deviceId" Name="Get BitlockerKeyTest" InformationClass="Computer" Section ="Intune" Id="5123e4f8-e183-428f-bff1-b3e2afdfc745">
<QuickAction-Server Category="Intune" Action="GetBitlockerKeyTest" ParameterType ="deviceId" Name="Get BitlockerKeyTest" InformationClass="Computer" Section ="Intune" Id="5123e4f8-e183-428f-bff1-b3e2afdfc745">
<Name Lang="DE">Test:Bitlocker Schlüssel anzeigen</Name>
<Name Lang="EN">Test:Show Bitlocker recoverykey</Name>
@@ -1035,13 +1054,13 @@
<ColumnOutputFormatting ValueName="volumeType" Name="Volume Type" Translation ="bitlocker_volume" Display="STRING">
<Name Lang="DE">Laufwerkstyp</Name>
</ColumnOutputFormatting>
<ColumnOutputFormatting ValueName="createdDateTime" Name="Created date" Display="STRING">
<ColumnOutputFormatting ValueName="createdDateTime" Name="Created date" Display="DATETIME">
<Name Lang="DE">Erstellungsdatum </Name>
</ColumnOutputFormatting>
</ColumnOutputFormattings>
</QuickAction-Server>
<QuickAction-Server Category="Intune" Action="GetLapsKeyTest" ParamaterType ="deviceId" Name="Get LAPSTest" InformationClass="Computer" Section ="Intune" Id="e0446b95-81b6-4a62-82cf-7c14988957ba" >
<QuickAction-Server Category="Intune" Action="GetLapsKeyTest" ParameterType ="deviceId" Name="Get LAPSTest" InformationClass="Computer" Section ="Intune" Id="e0446b95-81b6-4a62-82cf-7c14988957ba" >
<Name Lang="DE">Test:LAPS Passwort anzeigen</Name>
<Name Lang="EN">Test:Show LAPS Password</Name>
@@ -1057,14 +1076,14 @@
<ColumnOutputFormatting ValueName="passwordBase64" Name="Password" Display="STRING" IsSecret="true" >
<Name Lang="DE">Passwort</Name>
</ColumnOutputFormatting>
<ColumnOutputFormatting ValueName="backupDateTime" Name="Backup date" Display="STRING">
<ColumnOutputFormatting ValueName="backupDateTime" Name="Backup date" Display="DATETIME">
<Name Lang="DE">Sicherungsdatum </Name>
</ColumnOutputFormatting>
</ColumnOutputFormattings>
</QuickAction-Server>
<!--<QuickAction-Server Category="Intune" Action="ChangeManagedStatus" Name="Change ManagedStatus" ParamaterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="d35a9094-8068-483c-a58d-ab787657987a">
<!--<QuickAction-Server Category="Intune" Action="ChangeManagedStatus" Name="Change ManagedStatus" ParameterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="d35a9094-8068-483c-a58d-ab787657987a">
<Name Lang="DE">Verwaltungsstatus ändern</Name>
<Name Lang="EN">Change managed state</Name>
@@ -1088,7 +1107,7 @@
</AdjustableParameter-DropDown>
</AdjustableParameters>
</QuickAction-Server>-->
<!--<QuickAction-Server Category="Intune" Action="UpdateComplianceState" Name="Update ComplianceState" ParamaterType ="deviceId" InformationClass="MobileDevice" Section ="MobileDevice" Id="37453657-94a7-4e72-b8f4-eaa4b085536d">
<!--<QuickAction-Server Category="Intune" Action="UpdateComplianceState" Name="Update ComplianceState" ParameterType ="deviceId" InformationClass="MobileDevice" Section ="MobileDevice" Id="37453657-94a7-4e72-b8f4-eaa4b085536d">
<Name Lang="DE">Intune Komformitätsstatus erzwingen</Name>
<Name Lang="EN">Enforce Intune compliance state</Name>
<Description Lang="DE">Komformitätsstatus aktualisieren</Description>
@@ -1096,7 +1115,7 @@
<Icon IconType="material" Name="ic_verified_user" />
</QuickAction-Server>
<QuickAction-Server Category="Intune" Action="GetManagedApps" Name="Get Managed Apps" ParamaterType ="deviceId" InformationClass="MobileDevice" Section ="MobileDevice" Id="157212a0-8d4b-4431-b119-86d9df92ef16" >
<QuickAction-Server Category="Intune" Action="GetManagedApps" Name="Get Managed Apps" ParameterType ="deviceId" InformationClass="MobileDevice" Section ="MobileDevice" Id="157212a0-8d4b-4431-b119-86d9df92ef16" >
<Name Lang="DE">Verwaltete Anwendungen anzeigen</Name>
<Name Lang="EN">Show managed applications</Name>
@@ -1129,7 +1148,7 @@
</QuickAction-Local-WebRequest>-->
<QuickAction-Server Category="Citrix" Action="SessionLogoff" ParamaterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Session Logoff" InformationClass="VirtuelSession" Section ="Citrix" Id="da4662c3-1988-413a-a834-aec81508a8d1">
<QuickAction-Server Category="Citrix" Action="SessionLogoff" ParameterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Session Logoff" InformationClass="VirtualSession" Section ="Citrix" Id="da4662c3-1988-413a-a834-aec81508a8d1">
<Name Lang="DE">Session abmelden</Name>
<Name Lang="EN">Session logoff</Name>
<Description Lang="DE">Session Abmelden</Description>
@@ -1140,7 +1159,7 @@
</CheckNamedParameterValues>
</QuickAction-Server>
<QuickAction-Server Category="Citrix" Action="SessionHidden" ParamaterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Session Hidden" InformationClass="VirtuelSession" Section ="Citrix" Id="be8bbe9d-a9a2-4c72-9fbb-4b7feb502388">
<QuickAction-Server Category="Citrix" Action="SessionHidden" ParameterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Session Hidden" InformationClass="VirtualSession" Section ="Citrix" Id="be8bbe9d-a9a2-4c72-9fbb-4b7feb502388">
<Name Lang="DE">Session verstecken</Name>
<Name Lang="EN">Session hidden</Name>
<Description Lang="DE">Session verstecken</Description>
@@ -1151,7 +1170,7 @@
</CheckNamedParameterValues>
</QuickAction-Server>
<QuickAction-Server Category="Citrix" Action="SendMessageToSession" ParamaterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Send Message to Session" InformationClass="VirtuelSession" Section ="Citrix" Id="b7d197ef-f690-4a25-9dea-d2cf68df98b6">
<QuickAction-Server Category="Citrix" Action="SendMessageToSession" ParameterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Send Message to Session" InformationClass="VirtualSession" Section ="Citrix" Id="b7d197ef-f690-4a25-9dea-d2cf68df98b6">
<Name Lang="DE">Nachricht senden zu Session</Name>
<Name Lang="EN">Send Message to Session</Name>
@@ -1162,5 +1181,24 @@
<CheckNamedParameterValue>5</CheckNamedParameterValue>
</CheckNamedParameterValues>
</QuickAction-Server>
<QuickAction-Local-WebRequest InformationClass="Computer" Name="Open Inventory (web)" RunImmediate="true" CheckNamedParameter="EmpirumDeviceId" Section="Empirum" Id="4d6f1717-e7fd-4d22-baad-a3d3dc24efe0">
<Name Lang="DE">Empirum Inventur öffnen</Name>
<AlternativeDescription Lang="EN">This Quick Action requires information about the "Inventory of Device".</AlternativeDescription>
<AlternativeDescription Lang="DE">Um diese Quick Action verwenden zu können werden Informationen über das "Gerät" benötigt.</AlternativeDescription>
<Icon IconType="material" Name="ic_open_in_browser" />
<QueryString>https://intune.microsoft.com/#view/Microsoft_Intune_Devices/DeviceSettingsMenuBlade/~/overview/mdmDeviceId/PARAM_EmpirumDeviceId</QueryString>
<QueryParameter Name="PARAM_EmpirumDeviceId" ParameterName="EmpirumDeviceId" />
</QuickAction-Local-WebRequest>
<QuickAction-Server Category="Empirum" Action="GetInstallationStatus" ParameterType ="empirumId" Name="Get Installation Status" InformationClass="Computer" Section ="Empirum" Id="0700468d-2ae4-4875-a455-598102254c8f">
<Name Lang="DE">Nachricht senden zu Session</Name>
<Name Lang="EN">Send Message to Session</Name>
<Description Lang="DE">Nachricht senden zu Session</Description>
<Description Lang="EN">Send Message to Session</Description>
<Icon IconType="material" Name="ic_vpn_key" />
</QuickAction-Server>
</QuickActions>
</F4SD-QuickAction-Configuration>

View File

@@ -27,7 +27,7 @@
<xs:enumeration value="User" />
<xs:enumeration value="Computer" />
<xs:enumeration value="Ticket" />
<xs:enumeration value="VirtuelSession" />
<xs:enumeration value="VirtualSession" />
<xs:enumeration value="MobileDevice" />
</xs:restriction>
</xs:simpleType>
@@ -197,6 +197,16 @@
</xs:attribute>
</xs:complexType>
<xs:element name="QuickAction-Native" substitutionGroup="QuickAction">
<xs:complexType >
<xs:complexContent>
<xs:extension base="QuickAction">
<xs:attribute name="NativeName" type="xs:NCName" use="required" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:complexType name="QuickAction-Local" abstract="true">
<xs:complexContent>
<xs:extension base="QuickAction">
@@ -249,7 +259,7 @@
<xs:extension base="QuickAction-Remote">
<xs:attribute name="Category" use="optional" />
<xs:attribute name="Action" use="optional" />
<xs:attribute name="ParamaterType" use="optional" />
<xs:attribute name="ParameterType" use="optional" />
</xs:extension>
</xs:complexContent>
</xs:complexType>

View File

@@ -723,6 +723,22 @@
SELECT @cnt
</Query>
<!--<Query Name="UpdateDbTablesV1.10"/> used in the past and removed-->
<Query Name="UpdateDbTablesV1.11">
DECLARE @cnt INT
SET @cnt = 0
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N&apos;[main-user-tokens]&apos;) AND type in (N&apos;U&apos;))
AND NOT EXISTS (SELECT * FROM Information_Schema.Columns WHERE Table_Name = &apos;main-user-tokens&apos; AND Column_Name = &apos;id_remote&apos;)
BEGIN
PRINT N&apos;Start adding column [id_remote] to table [main-user-tokens] ...&apos;;
ALTER Table [main-user-tokens] ADD [id_remote] NVARCHAR(64) NULL;
SET @cnt = @cnt + 1;
PRINT N&apos;... done.&apos;
END
SELECT @cnt
</Query>
<Query Name="UpdateDbVersion">
IF NOT EXISTS (SELECT 1 FROM [main-db-version] WHERE [db_version] = @version AND [db_revision] = @revision)
INSERT INTO [main-db-version] ([db_version], [db_revision]) VALUES (@version,@revision);
@@ -931,10 +947,24 @@
<Query Name="UpdateComputerIntune">
UPDATE [main-computer] SET [id_intune]=@id WHERE [deviceId_azure]=@deviceId
</Query>
<Query Name="UpdateComputerIntune2">
<Query Name="UpdateComputerIntune2">
UPDATE [main-computer] SET [id_intune]=@id, [deviceid_azure]=@deviceid, tenant_azure = @tenant WHERE upn_internal = @upn_internal and [domainNB] is null
</Query>
<Query Name="UpdateUserCitrix">
<Query Name="GetUserBySidOrUpn">
DECLARE @ID UNIQUEIDENTIFIER
SET @ID = (SELECT id FROM [main-user] WHERE [sid_bin] = @SID)
IF (@ID is null) SET @ID = (SELECT id FROM [main-user] WHERE [upn_external] = @UPN)
SELECT @ID
</Query>
<Query Name="GetForeignUserInfo">
SELECT [id],[origin],[instance],[id_foreign] FROM [main-user-foreign-ids] WHERE [ID] = @ID
</Query>
<Query Name="UpdateForeignUsernfo">
UPDATE [main-user-foreign-ids] SET [id] = @ID WHERE [origin] = @origin and [instance] = @instance and [id_foreign] = @id_foreign
IF @@ROWCOUNT = 0
INSERT INTO [main-user-foreign-ids] ([id], [origin], [instance], [id_foreign]) VALUES (@id, @origin, @instance, @id_foreign)
</Query>
<Query Name="UpdateUserCitrix">
UPDATE [main-user] SET [id_citrix]=@id WHERE [sid_bin]=@sid_bin
</Query>
<Query Name="UpdateUserCitrix2">
@@ -2526,14 +2556,14 @@
SELECT [Key],[Value] FROM [main-config]
</Query>
<Query Name="GetAllExternalTokens">
SELECT [id],[type],[name],[name2],[secret],[validUntil],[renewUntil] FROM [main-user-tokens]
SELECT [id],[type],[name],[name2],[secret],[validUntil],[renewUntil],[id_remote] FROM [main-user-tokens]
</Query>
<Query Name="RemoveExpieredExternalTokens">
DELETE FROM [main-user-tokens] WHERE [validUntil] &lt; @ValidUntil
</Query>
<Query Name="InsertOrUpdateExternalToken">
UPDATE [main-user-tokens] SET [name]=@Name, [name2]=@Name2, [secret]=@Secret, [validUntil]=@ValidUntil, [renewUntil]=@RenewUntil WHERE [id]=@Id AND [type]=@Type
IF @@ROWCOUNT = 0 INSERT INTO [main-user-tokens] ([id], [type], [name], [name2], [secret], [validUntil], [renewUntil]) VALUES (@Id, @Type, @Name, @Name2, @Secret, @ValidUntil, @RenewUntil)
UPDATE [main-user-tokens] SET [name]=@Name, [name2]=@Name2, [secret]=@Secret, [validUntil]=@ValidUntil, [renewUntil]=@RenewUntil, [id_remote]=@IdRemote WHERE [id]=@Id AND [type]=@Type
IF @@ROWCOUNT = 0 INSERT INTO [main-user-tokens] ([id], [type], [name], [name2], [secret], [validUntil], [renewUntil], [id_remote]) VALUES (@Id, @Type, @Name, @Name2, @Secret, @ValidUntil, @RenewUntil, @IdRemote)
SELECT @@ROWCOUNT
</Query>
<Query Name="GetComputerVitalSignInfoForIntune">

View File

@@ -1,12 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<C4IT-License-Info Product="First Aid Service Desk (F4SD)" Id="776D99A6-D341-4B70-BA4B-2CC55B76A079">
<License Id="FAE53860-0AE2-4A15-A5D5-7E56D4D29FDE" Revision="1.0" Type="PRODUCTIVE" Customer="Consulting4IT" CustomerId="A3A5E66E-6A91-44E2-9F3A-F04C67642BCB" StartDate="2024-12-01" EndDate="2026-12-31" Signature="A3u3fZ5bU5p3CikLiOyCMdrsJCLtvQkdbUcIhPfo0gZruL4jvy/cXGeqwHgCNK4P+vVJi+7XtxfBvefTFVAs4QT2vSP+m7DPj1CB//zLOEhUHQVqim3KyQiIWtlMi/hruO+XKL6BAOYuNsSOR3eit95e9JPc60qNNL4gArdGe5I=">
<License-Metrics Type="ManagedUsers" Count="10000" />
<Modules>
<Module Name="F4SD client agent connector" Id="F8A3284C-E481-4D08-A921-949D2EBD4E0B" />
<Module Name="MS Active Directory connector" Id="B2D48023-56E8-44D5-AB77-BE1DCF4EA4EB" />
<Module Name="Matrix42 WPM conntector" Id="9CE1A6BE-6A0C-4A27-94A5-44AB997B8E62" />
<Module Name="Nexthink NXQL conntector" Id="51EA7764-3AD3-4F90-89DB-DEB0C60D655C" />
</Modules>
</License>
<License Id="FAE53860-0AE2-4A15-A5D5-7E56D4D29FDE" Revision="1.0" Type="PRODUCTIVE" Customer="Consulting4IT" CustomerId="A3A5E66E-6A91-44E2-9F3A-F04C67642BCB" StartDate="2024-12-01" EndDate="2026-12-31" Signature="Mv5Xfm31zvnWth+kyd8PDcQJYFTW1Pnc2Hv2eeexBBJ/tQzlL3jj0gU0c7lBmdhzwoWj3LAzNDtmB0pNQcTKQLIKmaWucG2AoBCXrGIijOToefFFQFOLFv+lr2bmNW7iR1wg8EWI0l1Uft/Tei6tF9ddjgMzFCb7FzI9OWfSvOo=">
<License-Metrics Type="ManagedUsers" Count="10000" />
<Modules>
<Module Name="Citrix Virtual Apps and Desktops connector" Id="F2DA5E05-FD3C-4182-9164-9C722140BF85" />
<Module Name="MS Active Directory connector" Id="B2D48023-56E8-44D5-AB77-BE1DCF4EA4EB" />
<Module Name="Nexthink NXQL conntector" Id="51EA7764-3AD3-4F90-89DB-DEB0C60D655C" />
<Module Name="Matrix42 WPM connector" Id="9CE1A6BE-6A0C-4A27-94A5-44AB997B8E62" />
<Module Name="F4SD client agent connector" Id="F8A3284C-E481-4D08-A921-949D2EBD4E0B" />
</Modules>
</License>
</C4IT-License-Info>

View File

@@ -1,19 +1,15 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using C4IT.DataHistoryProvider;
using System.Reflection;
using C4IT.Logging;
using System.Threading;
using System.Reflection;
using C4IT.Logging;
using C4IT.DataHistoryProvider;
using C4IT.DataHistoryProvider.Base.Modules.Citrix;
using static C4IT.Logging.cLogManager;
using System.Threading;
namespace C4IT_DataHistoryProvider_Test
{
public partial class ctrlCitrix: UserControl
@@ -39,12 +35,22 @@ namespace C4IT_DataHistoryProvider_Test
Program.Collector.CleanupUiMessageHandler();
Program.Collector.ProcessUiMessage += ctrlProtocolBox1.ProcessMessage;
var _requestInfo = new cF4sdWebRequestInfo("btnConnectCitrix_Click", null);
var tenants = Program.Collector.InfrastructureConfig.CitrixTenants?.Values;
var systems = Program.Collector.InfrastructureConfig.Citrix.Systems;
ctrlProtocolBox1.ProcessMessage($"Validating Citrix connections...");
foreach (var Tenant in tenants)
await Program.Collector.CitrixCollector.ValidateConnectionsAsync(CancellationToken.None);
ctrlProtocolBox1.ProcessMessage($"Validating Citrix connections finished.");
return;
foreach (var _system in systems)
{
var result = await Program.Collector.CitrixCollector.GetCitrixCommunicationForTenantAsync(Tenant.TenantID, false);
if (!(_system is cDataHistoryCitrixCloudTenant Tenant))
continue;
var result = await Program.Collector.CitrixCollector.GetCitrixCommunicationForSystemAsync(Tenant.TenantID, false);
if (result != null)
{
ctrlProtocolBox1.ProcessMessage($"Citrix connection for tenant {Tenant.TenantID} successful");
@@ -84,13 +90,17 @@ namespace C4IT_DataHistoryProvider_Test
Program.Collector.CleanupUiMessageHandler();
Program.Collector.ProcessUiMessage += ctrlProtocolBox1.ProcessMessage;
var _requestInfo = new cF4sdWebRequestInfo("btnConnectCitrix_Click", null);
var tenants = Program.Collector.InfrastructureConfig.CitrixTenants?.Values;
var systems = Program.Collector.InfrastructureConfig.Citrix.Systems;
foreach (var Tenant in tenants)
foreach (var _system in systems)
{
if (!(_system is cDataHistoryCitrixCloudTenant Tenant))
continue;
var result = await Program.Collector.CitrixCollector.GetCitrixUsersAsync();
if (result != null)
if (result)
{
ctrlProtocolBox1.ProcessMessage($"Citrix connection for tenant {Tenant.TenantID} successful");
}
@@ -129,13 +139,16 @@ namespace C4IT_DataHistoryProvider_Test
Program.Collector.CleanupUiMessageHandler();
Program.Collector.ProcessUiMessage += ctrlProtocolBox1.ProcessMessage;
var _requestInfo = new cF4sdWebRequestInfo("btnGetSessions_Click", null);
var tenants = Program.Collector.InfrastructureConfig.CitrixTenants?.Values;
var systems = Program.Collector.InfrastructureConfig.Citrix.Systems;
foreach (var Tenant in tenants)
foreach (var _system in systems)
{
if (!(_system is cDataHistoryCitrixCloudTenant Tenant))
continue;
var result = await Program.Collector.CitrixCollector.GetCitrixSessionsAsync();
if (result != null)
if (result)
{
ctrlProtocolBox1.ProcessMessage($"Citrix connection for tenant {Tenant.TenantID} successful");
}
@@ -170,8 +183,6 @@ namespace C4IT_DataHistoryProvider_Test
{
Cursor = Cursors.WaitCursor;
if (Program.Collector == null)
return;
@@ -179,23 +190,16 @@ namespace C4IT_DataHistoryProvider_Test
Program.Collector.CleanupUiMessageHandler();
Program.Collector.ProcessUiMessage += ctrlProtocolBox1.ProcessMessage;
var _requestInfo = new cF4sdWebRequestInfo("btnScanUsers_Click", null);
var tenants = Program.Collector.InfrastructureConfig.CitrixTenants?.Values;
ctrlProtocolBox1.ProcessMessage($"Starting Citrix user scans...");
foreach (var Tenant in tenants)
{
var result = await Program.Collector.CitrixCollector.DoScanAsync(true, true, _requestInfo, 1, CancellationToken.None);
if (result)
{
ctrlProtocolBox1.ProcessMessage($"Citrix connection for tenant {Tenant.TenantID} successful");
}
else
{
ctrlProtocolBox1.ProcessMessage($"Citrix connection for tenant {Tenant.TenantID} failed");
}
}
Program.Collector.CitrixCollector.DoScanSequential = true;
var result = await Program.Collector.CitrixCollector.DoScanAsync(true, true, _requestInfo, 0, CancellationToken.None);
if (result)
ctrlProtocolBox1.ProcessMessage($"All Citrix user scans finished successfully.");
else
ctrlProtocolBox1.ProcessMessage($"At least one Citrix user scan finished with errors.");
}
catch (Exception E)
{

View File

@@ -231,7 +231,7 @@ namespace C4IT_DataHistoryProvider_Test
if (Program.Collector.InfrastructureConfig.F4SDAnalyticsDB != null)
Program.mainForm.tabControlMain.TabPages.Add(Program.mainForm.tabPageF4SDAnalytics);
if (Program.Collector.CitrixCollector != null && Program.Collector.InfrastructureConfig.CitrixTenants?.Values != null)
if (Program.Collector.CitrixCollector != null && Program.Collector.InfrastructureConfig.Citrix.Systems != null)
Program.mainForm.tabControlMain.TabPages.Add(Program.mainForm.tabPageCitrix);
if (Program.Collector.NxqlCollector != null && !Program.mainForm.tabControlMain.TabPages.Contains(Program.mainForm.tabPageNexthink))

View File

@@ -15,8 +15,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyInformationalVersion("2.6.1.1")]
[assembly: AssemblyVersion("2.6.*")]
[assembly: AssemblyInformationalVersion("2.7.1.0")]
[assembly: AssemblyVersion("2.7.*")]
[assembly: AssemblyMinClientVersion("2.6.0.0")]

View File

@@ -111,6 +111,9 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="..\..\C4IT FASD\_Common\C4IT.F4SD.Base.Ticket.cs">
<Link>Common\C4IT.F4SD.Base.Ticket.cs</Link>
</Compile>
<Compile Include="..\..\C4IT FASD\_Common\C4IT.F4SD.GlobalConfig.cs">
<Link>Common\C4IT.F4SD.GlobalConfig.cs</Link>
</Compile>

View File

@@ -2,7 +2,11 @@
using System.Collections.Generic;
using System.Data.Common;
using System.Diagnostics;
using System.DirectoryServices.AccountManagement;
using System.DirectoryServices.ActiveDirectory;
using System.Globalization;
using System.IdentityModel.Tokens.Jwt;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
@@ -13,28 +17,26 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
using System.IdentityModel.Tokens.Jwt;
using System.DirectoryServices.AccountManagement;
using System.DirectoryServices.ActiveDirectory;
using System.IO;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using C4IT.Configuration;
using C4IT.DataHistoryProvider.Base.Modules.Citrix;
using C4IT.FASD.Base;
using C4IT.FASD.Licensing;
using C4IT.Logging;
using C4IT.Matrix42.WebClient;
using C4IT.Security;
using C4IT.XML;
using C4IT.Matrix42.WebClient;
using C4IT_DataHistoryProvider_Base;
using C4IT_DataHistoryProvider_Base.DataSources;
using C4IT_DataHistoryProvider_Base.Services;
using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using static C4IT.FASD.Base.cF4sdQuickActionRevision;
using static C4IT.Logging.cLogManager;
@@ -105,7 +107,18 @@ namespace C4IT.DataHistoryProvider
public abstract Task<bool> DoScanAsync(bool Always, bool Rescan, cF4sdWebRequestInfo requestInfo, int LogDeep, CancellationToken Token, bool EnhancedDebug = false);
public abstract Task<List<object>> GetIds(cF4sdConnectorIds IdEntry, enumFasdInformationClass InfoClass, cF4sdWebRequestInfo requestInfo, int LogDeep);
public virtual async Task<List<object>> GetIds(cF4sdConnectorIds IdEntry, enumFasdInformationClass InfoClass, cF4sdWebRequestInfo requestInfo, int LogDeep)
{
await Task.CompletedTask;
if (IdEntry.sid == null)
return null;
return new List<object>() { IdEntry.Id };
}
public virtual bool UseForeignUserIds()
{
return false;
}
public virtual List<object> GetFilterValues(List<object> IDs, enumFasdInformationClass InfoClass)
{
@@ -222,6 +235,15 @@ namespace C4IT.DataHistoryProvider
await Task.CompletedTask;
return null;
}
public virtual async Task<int> ValidateTokenInfo(cDataHistoryCollectorTokenCache.cTokenInfo tokenInfo)
// 0: Token Info is correct
// -1: Token Info is incorrect
// 1: Token Info as to be updated due to newer infos
{
await Task.CompletedTask;
return 0;
}
}
public class cDataHistoryCollector : cDataHistoryCollectorModule, IConfigNodeValidation, ISearchResultRelationProvider
@@ -257,6 +279,7 @@ namespace C4IT.DataHistoryProvider
public cDataHistoryCollectorM42Wpm M42WpmCollector { get; private set; } = null;
public cDataHistoryCollectorNxql NxqlCollector { get; private set; } = null;
public cDataHistoryCollectorCitrix CitrixCollector { get; private set; } = null;
//public cDataHistoryCollectorEmpirum EmpirumCollector { get; private set; } = null;
public bool F4SDAnalyticsValid = false;
public cF4SDAnalyticsConfigDatabase F4SDAnalyticsDb { get; private set; } = null;
public event DataHistoryUiMessageFunc ProcessUiMessage;
@@ -279,6 +302,8 @@ namespace C4IT.DataHistoryProvider
private readonly List<ISearchResultRelationProvider> _searchResultRelationProviders = new List<ISearchResultRelationProvider>();
private Dictionary<cF4SDTokenRegistration.enumTokenType, cDataHistoryCollectorModule> _tokenValidators = new Dictionary<cF4SDTokenRegistration.enumTokenType, cDataHistoryCollectorModule>();
public bool RunningInIISExpress = false;
#region Services
@@ -288,7 +313,7 @@ namespace C4IT.DataHistoryProvider
public IStagedRelationService GetStagedRelationService()
{
if (_stagedRelationService is null)
_stagedRelationService = new StagedRelationService(_searchResultRelationProviders);
_stagedRelationService = new StagedRelationService(this, _searchResultRelationProviders);
return _stagedRelationService;
}
@@ -329,7 +354,7 @@ namespace C4IT.DataHistoryProvider
if (cF4SDLicense.Instance.Modules.ContainsKey(_ActiveDirectory.LicenseId))
{
ActiveDirectory = _ActiveDirectory;
Connectors.Add(enumDataHistoryOrigin.ActiveDirectory, ActiveDirectory);
Connectors.Add(enumDataHistoryOrigin.ActiveDirectory, ActiveDirectory);
}
var _F4sdAgent = new cDataHistoryCollectorClientAgent(this);
@@ -450,6 +475,7 @@ namespace C4IT.DataHistoryProvider
var HasIntuneConfig = (_cfgInfrastructure.AzureTenants?.Values.Any(t => t.ScanIntuneDevices) == true);
var HasMobileDeviceConfig = (_cfgInfrastructure.AzureTenants?.Values.Any(t => t.WithMobileDevices) == true);
var HasCitrixConfig = (InfrastructureConfig.Citrix != null);
var HasEmpirumConfig = true;
DoProcessUiMessage(1, "resolving the ad membership groups");
ActiveDirectory.ResolveWinAuthenticationGroups();
@@ -462,7 +488,7 @@ namespace C4IT.DataHistoryProvider
DoProcessUiMessage(0, "");
DoProcessUiMessage(1, "loading the data cluster definitions...");
var _cfgDataClusters = new cDataHistoryConfigClusters();
_cfgDataClusters.LoadFromFile(out PMs, withM42Config: HasM42Config, withIntuneConfig: HasIntuneConfig,withMobileDeviceConfig:HasMobileDeviceConfig,withCitrixConfig:HasCitrixConfig);
_cfgDataClusters.LoadFromFile(out PMs, withM42Config: HasM42Config, withIntuneConfig: HasIntuneConfig, withMobileDeviceConfig: HasMobileDeviceConfig, withCitrixConfig: HasCitrixConfig);
if (PMs != null && PMs.Count > 0)
DoProcessUiMessage(2, PMs);
@@ -509,24 +535,32 @@ namespace C4IT.DataHistoryProvider
{
var _CitrixCollector = new cDataHistoryCollectorCitrix(this);
if (cF4SDLicense.Instance?.Modules != null)
//if (cF4SDLicense.Instance.Modules.ContainsKey(_CitrixCollector.LicenseId))
//{
CitrixCollector = _CitrixCollector;
Connectors.Add(enumDataHistoryOrigin.Citrix, _CitrixCollector);
RegisterSearchRelationProvider(_CitrixCollector);
//}
if (cF4SDLicense.Instance.Modules.ContainsKey(_CitrixCollector.LicenseId))
{
CitrixCollector = _CitrixCollector;
Connectors.Add(enumDataHistoryOrigin.Citrix, _CitrixCollector);
RegisterSearchRelationProvider(_CitrixCollector);
}
}
if(HasIntuneConfig)
if (HasIntuneConfig)
{
Connectors.Add(enumDataHistoryOrigin.Intune, ActiveDirectory);
}
//if (HasIntuneConfig && HasMobileDeviceConfig)
//{
// RegisterSearchRelationProvider(ActiveDirectory);
//}
//if (HasEmpirumConfig)
//{
// var _EmpirumCollector = new cDataHistoryCollectorEmpirum(this);
// EmpirumCollector = _EmpirumCollector;
// Connectors.Add(enumDataHistoryOrigin.Empirum, EmpirumCollector);
//}
// do the post configuration tasks afer the infrastructure was loaded
DoProcessUiMessage(1, "processing post configuration tasks");
foreach (var Table in _cfgDataClusters.Tables.Values)
@@ -673,7 +707,7 @@ namespace C4IT.DataHistoryProvider
var HasMobileDeviceConfig = (InfrastructureConfig.AzureTenants?.Values.Any(t => t.WithMobileDevices) == true);
var HasCitrixConfig = (InfrastructureConfig.Citrix != null);
var _cfg = cFasdBaseConfig.GetConfigByType(_item, null, _msg, withM42Config: HasM42Config, withIntuneConfig: HasIntuneConfig, withMobileDeviceConfig: HasMobileDeviceConfig, withCitrixConfig:HasCitrixConfig);
var _cfg = cFasdBaseConfig.GetConfigByType(_item, null, _msg, withM42Config: HasM42Config, withIntuneConfig: HasIntuneConfig, withMobileDeviceConfig: HasMobileDeviceConfig, withCitrixConfig: HasCitrixConfig);
if (_cfg.IsValid)
{
_Configs[_item] = _cfg;
@@ -1201,7 +1235,6 @@ namespace C4IT.DataHistoryProvider
return false;
}
private async Task<bool> UpdateF4SDAnalyticsViewsAsync(cDbConnection DbConn, cF4sdWebRequestInfo requestInfo, int LogDeep, CancellationToken Token, bool ForceCreate)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
@@ -2490,7 +2523,7 @@ namespace C4IT.DataHistoryProvider
var anonymous = InfrastructureConfig.F4SDAnalyticsDB?.AnonymousUser;
Guid.TryParse(requestInfo.userInfo?.Id.ToString(), out Guid userGuid);
if (anonymous != null && (bool)anonymous)
Param.User = GetUserHashGuid(userGuid).ToString();
Param.User = GetUserHashGuid(userGuid).ToString();
else
Param.User = userGuid.ToString();
@@ -2666,17 +2699,27 @@ namespace C4IT.DataHistoryProvider
}
public async Task<cF4sdUserInfo> GetCurrentUserInfoAsync(CancellationToken Token, cF4sdWebRequestInfo requestInfo, int LogDeep)
public async Task<cF4sdUserInfo> GetCurrentUserInfoAsync(CancellationToken Token, cF4sdWebRequestInfo requestInfo, int logDeep)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
if (cPerformanceLogger.IsActive && requestInfo != null) { if (CM == null) CM = MethodBase.GetCurrentMethod(); cPerformanceLogger.LogPerformanceStart(LogDeep, CM, requestInfo.id, requestInfo.created); }
var _startTime = DateTime.UtcNow;
if (cPerformanceLogger.IsActive && requestInfo != null) { if (CM == null) CM = MethodBase.GetCurrentMethod(); cPerformanceLogger.LogPerformanceStart(logDeep, CM, requestInfo.id, requestInfo.created); }
var startTime = DateTime.UtcNow;
try
{
var _user = WindowsIdentity.GetCurrent();
var _res = await GetWinUserInfoAsync(_user, CultureInfo.CurrentCulture.DisplayName, true, Token, requestInfo, LogDeep + 1);
return _res;
if (!ActiveDirectory.WinAuthenticationGropsResolved)
{
ActiveDirectory.ResolveWinAuthenticationGroups();
if (!ActiveDirectory.WinAuthenticationGropsResolved)
{
LogEntry("Could not resolve authentication groups", LogLevels.Warning);
return null;
}
}
WindowsIdentity user = WindowsIdentity.GetCurrent();
return await GetWinUserInfoAsync(user, CultureInfo.CurrentCulture.DisplayName, true, Token, requestInfo, logDeep + 1);
}
catch (Exception E)
{
@@ -2684,7 +2727,7 @@ namespace C4IT.DataHistoryProvider
}
finally
{
if (cPerformanceLogger.IsActive && requestInfo != null) { cPerformanceLogger.LogPerformanceEnd(LogDeep, CM, requestInfo.id, requestInfo.created, _startTime); }
if (cPerformanceLogger.IsActive && requestInfo != null) { cPerformanceLogger.LogPerformanceEnd(logDeep, CM, requestInfo.id, requestInfo.created, startTime); }
if (CM != null) LogMethodEnd(CM);
}
@@ -2938,8 +2981,8 @@ namespace C4IT.DataHistoryProvider
}
if (strPhone != null)
{
Entry.Result.Name = strName + " (" + strPhone + ")";
Entry.Result.DisplayName = strName + " (" + strPhone + ")";
Entry.Result.Name = strName;
Entry.Result.DisplayName = $"{strName} ({strPhone})";
}
else
{
@@ -3853,7 +3896,7 @@ namespace C4IT.DataHistoryProvider
return null;
}
public async Task<List<cF4sdApiSearchResultRelation>> GetUsageFromOnlyAgentData(enumFasdInformationClass infoClass, List<Guid> Ids, int Age, CancellationToken Token, cF4sdWebRequestInfo requestInfo, int LogDeep)
public async Task<List<cF4sdApiSearchResultRelation>> GetUsageFromOnlyAgentData(IEnumerable<cF4sdConnectorIds> ids, enumFasdInformationClass infoClass, int Age, CancellationToken Token, cF4sdWebRequestInfo requestInfo, int LogDeep)
{
MethodBase CM = null;
if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
@@ -3862,20 +3905,15 @@ namespace C4IT.DataHistoryProvider
try
{
var _count = ids.Count();
var Age2 = Age;
if (Ids.Count == 1)
if (_count == 1)
Age2 = 365;
var AgentLimit = DateTime.UtcNow + TimeSpan.FromDays(-Age2);
var idInput = Ids.Select(v => new cF4sdIdentityEntry() { Id = v, Class = infoClass }).ToList();
var listIds = await getConnectorIdList(idInput, Token, requestInfo, LogDeep + 1);
var lstAgentIds = new Dictionary<int, cDataHistoryUsageIdInfo>(_count);
if (listIds == null || listIds.Count == 0)
return null;
var lstAgentIds = new Dictionary<int, cDataHistoryUsageIdInfo>(Ids.Count);
foreach (var Entry in listIds)
foreach (var Entry in ids)
{
if (Entry.lastSeenByAgent != null && Entry.lastSeenByAgent >= AgentLimit)
{
@@ -5237,7 +5275,7 @@ namespace C4IT.DataHistoryProvider
if (Connectors.TryGetValue(tableConfig.ParentCluster.Origin, out var C))
{
var IdValues = await C.GetIds(Identity, tableConfig.ParentCluster.InformationClass, requestInfo, LogDeep + 1);
if (IdValues != null && tableConfig.KeyColumns.Count == IdValues.Count)
if (IdValues != null && tableConfig.KeyColumns.Count == IdValues.Count)
{
var Filters = new Dictionary<string, object>();
for (int i = 0; i < IdValues.Count; i++)
@@ -5357,22 +5395,16 @@ namespace C4IT.DataHistoryProvider
return null;
}
private async Task<cF4sdConnectorIds> getConnectorIds(enumFasdInformationClass infoClass, cF4sdIdentityEntry Identity, CancellationToken Token, cF4sdWebRequestInfo requestInfo, int LogDeep, bool WithLocalAccounts = false)
private async Task<cF4sdConnectorIds> getConnectorIdsFromDb(enumFasdInformationClass infoClass, cF4sdIdentityEntry Identity, CancellationToken Token, cF4sdWebRequestInfo requestInfo, int LogDeep, bool WithLocalAccounts = false)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
if (cPerformanceLogger.IsActive && requestInfo != null) { if (CM == null) CM = MethodBase.GetCurrentMethod(); cPerformanceLogger.LogPerformanceStart(LogDeep, CM, requestInfo.id, requestInfo.created); }
var _startTime = DateTime.UtcNow;
int apiError = 0;
try
{
if (infoClass == enumFasdInformationClass.Ticket)
return new cF4sdConnectorIds() { Id = Identity.Id, infoClass = enumFasdInformationClass.Ticket };
if (infoClass == enumFasdInformationClass.VirtualSession)
return new cF4sdConnectorIds() { Id = Identity.Id, infoClass = enumFasdInformationClass.VirtualSession };
if (infoClass == enumFasdInformationClass.MobileDevice)
return new cF4sdConnectorIds() { Id = Identity.Id, infoClass = enumFasdInformationClass.MobileDevice };
int apiError = 0;
if (!DataHistorySqlHelper.GetWellKnownSqlStatement($"GetConnectorIdsFrom{infoClass}Id", out var Query))
return null;
@@ -5516,6 +5548,66 @@ namespace C4IT.DataHistoryProvider
return RetVal;
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (cPerformanceLogger.IsActive && requestInfo != null) { cPerformanceLogger.LogPerformanceEnd(LogDeep, CM, requestInfo.id, requestInfo.created, _startTime); }
if (CM != null) LogMethodEnd(CM);
}
return null;
}
private async Task<cF4sdConnectorIds> getConnectorIds(enumFasdInformationClass infoClass, cF4sdIdentityEntry Identity, CancellationToken Token, cF4sdWebRequestInfo requestInfo, int LogDeep, bool WithLocalAccounts = false)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
if (cPerformanceLogger.IsActive && requestInfo != null) { if (CM == null) CM = MethodBase.GetCurrentMethod(); cPerformanceLogger.LogPerformanceStart(LogDeep, CM, requestInfo.id, requestInfo.created); }
var _startTime = DateTime.UtcNow;
try
{
if (infoClass == enumFasdInformationClass.Ticket)
return new cF4sdConnectorIds() { Id = Identity.Id, infoClass = enumFasdInformationClass.Ticket };
if (infoClass == enumFasdInformationClass.VirtualSession)
return new cF4sdConnectorIds() { Id = Identity.Id, infoClass = enumFasdInformationClass.VirtualSession };
if (infoClass == enumFasdInformationClass.MobileDevice)
return new cF4sdConnectorIds() { Id = Identity.Id, infoClass = enumFasdInformationClass.MobileDevice };
var lstTasks = new List<Task>();
var _mainTask = getConnectorIdsFromDb(infoClass, Identity, Token, requestInfo, LogDeep + 1, WithLocalAccounts);
lstTasks.Add(_mainTask);
var _needForeignUserInfo = false;
if (infoClass == enumFasdInformationClass.User)
foreach (var module in this.Connectors.Values)
_needForeignUserInfo |= module.UseForeignUserIds();
Task<cForeignUserInfo> _userInfoTask = null;
if (_needForeignUserInfo)
{
_userInfoTask = GetForeignUserInfoAsync(Identity.Id, Token);
lstTasks.Add(_userInfoTask);
}
await Task.WhenAll(lstTasks);
var _result = _mainTask.Result;
if (_result == null)
return null;
if (_needForeignUserInfo)
_result.ForeignUserInfo = _userInfoTask?.Result;
return _result;
}
catch (Exception E)
{
@@ -6431,12 +6523,6 @@ namespace C4IT.DataHistoryProvider
return true;
}
public override async Task<List<object>> GetIds(cF4sdConnectorIds IdEntry, enumFasdInformationClass InfoClass, cF4sdWebRequestInfo requestInfo, int LogDeep)
{
await Task.CompletedTask;
return new List<object>() { IdEntry.Id };
}
public static string getStingList(List<string> L)
{
if (L == null || L.Count == 0)
@@ -6495,7 +6581,7 @@ namespace C4IT.DataHistoryProvider
return null;
}
public cCollectorStatusInfo GetCollectorStatus(cF4sdWebRequestInfo requestInfo)
public cCollectorStatusInfo CheckCollectorStatus(cF4sdWebRequestInfo requestInfo)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
@@ -6598,11 +6684,100 @@ namespace C4IT.DataHistoryProvider
public HashSet<enumFasdInformationClass> GetSupportedInformationClasses() => new HashSet<enumFasdInformationClass>() { enumFasdInformationClass.User, enumFasdInformationClass.Computer };
public async Task<cF4sdStagedSearchResultRelations> GetRelationsAsync(IEnumerable<cF4sdIdentityEntry> ids, enumFasdInformationClass informationClass, int age, CancellationToken token = default)
public async Task<cF4sdStagedSearchResultRelations> GetRelationsAsync(IEnumerable<cF4sdConnectorIds> ids, enumFasdInformationClass informationClass, int age, CancellationToken token = default)
{
List<cF4sdApiSearchResultRelation> usageRelations = await GetUsageFromOnlyAgentData(informationClass, ids.Select(id => id.Id).ToList(), age, token, null, 1);
List<cF4sdApiSearchResultRelation> usageRelations = await GetUsageFromOnlyAgentData(ids, informationClass, age, token, null, 1);
return new cF4sdStagedSearchResultRelations() { Relations = usageRelations };
}
public void RegisterTokenValidator(cF4SDTokenRegistration.enumTokenType tokenType, cDataHistoryCollectorModule module)
{
_tokenValidators[tokenType] = module;
}
public async override Task<int> ValidateTokenInfo(cDataHistoryCollectorTokenCache.cTokenInfo tokenInfo)
{
if (_tokenValidators.TryGetValue(tokenInfo.type, out var module))
return await module.ValidateTokenInfo(tokenInfo);
return 0;
}
public class cForeignUserInfoEntry
{
public Guid MainID { get; set; }
public enumDataHistoryOrigin Origin { get; set; }
public string InstanceID { get; set; }
public string ForeignID { get; set; }
}
public class cForeignUserInfo : Dictionary<enumDataHistoryOrigin, List<cForeignUserInfoEntry>> { }
public async Task<cForeignUserInfo> GetForeignUserInfoAsync(Guid MainID, CancellationToken token)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
if (!DataHistorySqlHelper.GetWellKnownSqlStatement("GetForeignUserInfo", out var QueryGetUser))
return null;
using (var Conn = new cDbConnection(Collector.mainDbConnection))
{
if (!Conn.IsOpen)
{
LogEntry($"Could not open main sql database '{Collector.mainDbConnection.Database}', aborting scan...'", LogLevels.Error);
return null;
}
var Params = new Dictionary<string, object>() { { "@ID", MainID } };
using (var Reader = await DataHistorySqlHelper.GetDataReaderAsync(Conn, QueryGetUser, Params, token))
{
if (Reader != null)
if (Reader.HasRows)
{
var _retVal = new cForeignUserInfo();
while (await Reader.ReadAsync(token))
{
try
{
var Entry = new cForeignUserInfoEntry();
Entry.MainID = Reader.GetGuid(0);
Entry.Origin = (enumDataHistoryOrigin)Reader.GetInt32(1);
Entry.InstanceID = Reader.GetString(2);
Entry.ForeignID = Reader.GetString(3);
if (!_retVal.TryGetValue(Entry.Origin, out var _lst))
{
_lst = new List<cForeignUserInfoEntry>();
_retVal.Add(Entry.Origin, _lst);
}
_lst.Add(Entry);
}
catch (Exception E)
{
cLogManager.DefaultLogger.LogException(E);
}
}
return _retVal;
}
}
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
return null;
}
}
public class cScanTimeInfo
@@ -6736,7 +6911,13 @@ namespace C4IT.DataHistoryProvider
public Guid tenantId { get; set; }
public Guid intuneId { get; set; }
public Guid azureDeviceId { get; set; }
public cDataHistoryCollector.cForeignUserInfo ForeignUserInfo = null;
[Obsolete]
public string citrixTenantId { get; set; }
[Obsolete]
public int? citrixUserId { get; set; }
}

View File

@@ -1,7 +1,15 @@
using System;
using ActiveDs;
using C4IT.FASD.Base;
using C4IT.HTTP;
using C4IT.Logging;
using C4IT.MsGraph;
using C4IT_DataHistoryProvider_Base.DataSources;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.DirectoryServices.AccountManagement;
using System.DirectoryServices.ActiveDirectory;
using System.DirectoryServices.Protocols;
using System.Globalization;
using System.Linq;
@@ -9,16 +17,8 @@ using System.Net;
using System.Reflection;
using System.Security.Principal;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using ActiveDs;
using C4IT.FASD.Base;
using C4IT.HTTP;
using C4IT.Logging;
using C4IT.MsGraph;
using C4IT_DataHistoryProvider_Base.DataSources;
using Newtonsoft.Json.Linq;
using static C4IT.Logging.cLogManager;
namespace C4IT.DataHistoryProvider
@@ -50,6 +50,7 @@ namespace C4IT.DataHistoryProvider
public const string constMsGraphDeviceBitlockerRecoveryKey = "informationProtection/bitlocker/recoveryKeys?$filter=deviceId eq '{0}'";
public const string constMsGraphDeviceBitlockerRecoveryKeyDetails = "informationProtection/bitlocker/recoveryKeys/{0}?$select=key";
public const string constMsGraphDeviceLAPS = "directory/deviceLocalCredentials/{0}?$select=credentials,deviceName";
public const string constMsGraphTAP = "users/{0}/authentication/temporaryAccessPassMethods";
public const int constMsGraphManagedDevicePaging = 100;
public const string constTableNameIntuneDeviceDetails = "intune-deviceInfo";
public const string constTableNameIntuneUserDeviceCount = "intune-userDeviceCount";
@@ -93,6 +94,7 @@ namespace C4IT.DataHistoryProvider
private DateTime LastDomainsUpdate = DateTime.MinValue;
private bool DomainsUpdateRunning = false;
private Dictionary<Guid, cMsGraphBase> tenantGraphCache = new Dictionary<Guid, cMsGraphBase>();
public bool WinAuthenticationGropsResolved { get; private set; }
static cDataHistoryCollectorActiveDirectory()
{
BaseDateTime = new DateTime(1601, 1, 1, 0, 0, 0, DateTimeKind.Utc);
@@ -2053,13 +2055,17 @@ namespace C4IT.DataHistoryProvider
return true;
}
public async Task<cF4sdStagedSearchResultRelations> GetRelationsAsync(IEnumerable<cF4sdIdentityEntry> ids, enumFasdInformationClass informationClass, int age, CancellationToken token = default)
public async Task<cF4sdStagedSearchResultRelations> GetRelationsAsync(IEnumerable<cF4sdConnectorIds> ids, enumFasdInformationClass informationClass, int age, CancellationToken token = default)
{
try
{
/*
List<cF4sdConnectorIds> Ids = await _collector.getConnectorIdList(ids.ToList(), token, null, 0);
List<cF4sdApiSearchResultRelation> relations = await GetUserMobileDevicesAsync(Ids, token, null);
return new cF4sdStagedSearchResultRelations() { Relations = relations };
*/
return null;
}
catch (Exception ex)
{
@@ -2082,14 +2088,16 @@ namespace C4IT.DataHistoryProvider
var bMobileDeviceExists = Tables.Exists(v => v.Name == constTableNameIntuneMobileDeviceDetails && v.ParentCluster?.Origin == enumDataHistoryOrigin.Intune);
if (!Identities.TryGetValue(enumFasdInformationClass.Computer, out var computer) && computer?.intuneId != Guid.Empty)
if (!Identities.TryGetValue(enumFasdInformationClass.User, out var user) && user?.intuneId != Guid.Empty && user?.tenantId != Guid.Empty)
bUserDeviceExists = false;
if (!Identities.TryGetValue(enumFasdInformationClass.Computer, out var computer) && computer?.intuneId != Guid.Empty && user?.tenantId != Guid.Empty)
bDeviceExists = false;
if(!Identities.TryGetValue(enumFasdInformationClass.MobileDevice, out var mobile) && mobile?.Id != Guid.Empty)
if (!Identities.TryGetValue(enumFasdInformationClass.MobileDevice, out var mobile) && mobile?.Id != Guid.Empty)
bMobileDeviceExists = false;
if(!Identities.TryGetValue(enumFasdInformationClass.User, out var user) && user?.intuneId != Guid.Empty)
bUserDeviceExists = false;
if (!(bDeviceExists || bMobileDeviceExists || bUserDeviceExists))
@@ -2111,8 +2119,8 @@ namespace C4IT.DataHistoryProvider
}
else
listTasks.Add(Task.Run<List<cF4SDHealthCardRawData.cHealthCardTable>>(async () => { return await GetIntuneDeviceTableAsync(computer.intuneId, computer.tenantId, requestInfo, LogDeep + 1, Token); }));
listTasks.Add(Task.Run<List<cF4SDHealthCardRawData.cHealthCardTable>>(async () => { return await GetIntuneDeviceTableAsync(computer.intuneId, user.tenantId, requestInfo, LogDeep + 1, Token); }));
if (bMobileDeviceExists)
if (CacheId == null && !instantly)
{
@@ -2237,20 +2245,22 @@ namespace C4IT.DataHistoryProvider
if (MsGraph == null)
return null;
var retVal = new cF4SDHealthCardRawData.cHealthCardTable()
{
Name = constTableNameIntuneDeviceDetails,
InformationClass = enumFasdInformationClass.Computer,
Origin = enumDataHistoryOrigin.Intune,
IsStatic = true,
TableType = eDataHistoryTableType.Static
};
var dicVals = new Dictionary<string, object>();
var res = await MsGraph.RequestAsync(strUrl, UseBeta: true, retryForbidden: false);
if (res != null)
{
JObject deviceInfos = res.Result;
var retVal = new cF4SDHealthCardRawData.cHealthCardTable()
{
Name = constTableNameIntuneDeviceDetails,
InformationClass = enumFasdInformationClass.Computer,
Origin = enumDataHistoryOrigin.Intune,
IsStatic = true,
TableType = eDataHistoryTableType.Static
};
var dicVals = new Dictionary<string, object>();
var vals = deviceInfos.Children();
if (cLogManager.DefaultLogger.IsDebug) LogEntry("SpecialDebug GetIntuneMainTableAsync #3");
@@ -2290,6 +2300,16 @@ namespace C4IT.DataHistoryProvider
else
{
LogEntry($"Could not get detailed device information from intune with id {IntuneId}. Device content is empty.", LogLevels.Warning);
foreach (var colInfo in IntuneTableDetails.Columns.Values)
{
try
{
var _col = new cF4SDHealthCardRawData.cHealthCardTableColumn(retVal) { ColumnName = colInfo.Name, Values = new List<object>(1) { } };
retVal.Columns[colInfo.Name] = _col;
}
catch { }
}
return new List<cF4SDHealthCardRawData.cHealthCardTable>(1) { retVal };
}
}
catch (Exception E)
@@ -2326,17 +2346,19 @@ namespace C4IT.DataHistoryProvider
if (cLogManager.DefaultLogger.IsDebug) LogEntry("SpecialDebug GetIntuneUserDeviceCountTableAsync #3");
var res = await MsGraph.RequestAsync(strUrl, UseBeta: false, retryForbidden: false);
if (cLogManager.DefaultLogger.IsDebug) LogEntry("SpecialDebug GetIntuneUserDeviceCountTableAsync #4");
var retVal = new cF4SDHealthCardRawData.cHealthCardTable()
{
Name = constTableNameIntuneUserDeviceCount,
InformationClass = enumFasdInformationClass.User,
Origin = enumDataHistoryOrigin.Intune,
IsStatic = true,
TableType = eDataHistoryTableType.Static
};
if (res != null)
{
JObject deviceInfos = res.Result;
var retVal = new cF4SDHealthCardRawData.cHealthCardTable()
{
Name = constTableNameIntuneUserDeviceCount,
InformationClass = enumFasdInformationClass.User,
Origin = enumDataHistoryOrigin.Intune,
IsStatic = true,
TableType = eDataHistoryTableType.Static
};
var vals = deviceInfos.Children();
@@ -2405,6 +2427,16 @@ namespace C4IT.DataHistoryProvider
else
{
LogEntry($"Could not get detailed DeviceCount information from intune with id {Userid}. DeviceCount content is empty.", LogLevels.Warning);
foreach (var colInfo in IntuneTableDetails.Columns.Values)
{
try
{
var _col = new cF4SDHealthCardRawData.cHealthCardTableColumn(retVal) { ColumnName = colInfo.Name, Values = new List<object>(1) { } };
retVal.Columns[colInfo.Name] = _col;
}
catch { }
}
return new List<cF4SDHealthCardRawData.cHealthCardTable>(1) { retVal };
}
}
catch (Exception E)
@@ -2437,26 +2469,25 @@ namespace C4IT.DataHistoryProvider
var MsGraph = await GetGraphForTenantAsync(TenantId, true);
if (MsGraph == null)
return null;
var retValList = new List<cF4SDHealthCardRawData.cHealthCardDetailsTable>();
var res = await MsGraph.RequestAsync(strUrl, UseBeta: false, retryForbidden: false);
var retVal = new cF4SDHealthCardRawData.cHealthCardDetailsTable()
{
Name = constTableNameIntuneUserDeviceCountDetail,
Columns = IntuneTableDetails.Columns.Values.Select(v => v.Name).ToList(),
Values = new Dictionary<int, List<object[]>>()
};
if (res != null)
{
JObject deviceInfos = res.Result;
var retValList = new List<cF4SDHealthCardRawData.cHealthCardDetailsTable>();
var vals = deviceInfos["value"] as JArray;
if (vals != null)
{
var retVal = new cF4SDHealthCardRawData.cHealthCardDetailsTable()
{
Name = constTableNameIntuneUserDeviceCountDetail,
Columns = IntuneTableDetails.Columns.Values.Select(v => v.Name).ToList(),
Values = new Dictionary<int, List<object[]>>()
};
int index = 0;
@@ -2488,6 +2519,8 @@ namespace C4IT.DataHistoryProvider
else
{
LogEntry($"Could not get detailed DeviceCount information from intune with id {Userid}. DeviceCount content is empty.", LogLevels.Warning);
retValList.Add(retVal);
return retValList;
}
}
return null;
@@ -2512,25 +2545,25 @@ namespace C4IT.DataHistoryProvider
{
string userIds = string.Join(",", UserId.Where(u => !string.IsNullOrWhiteSpace(u?.intuneId.ToString())).Select(u => u.intuneId));
var tenantId = UserId?.FirstOrDefault(u => u?.tenantId != Guid.Empty)?.tenantId ?? Guid.Empty;
var tenantId = UserId?.FirstOrDefault(u => u?.tenantId != Guid.Empty)?.tenantId ?? Guid.Empty;
var strUrl = string.Format(constMsGraphManagedMobileDeviceList, userIds);
var MsGraph = await GetGraphForTenantAsync(tenantId, true);
if (MsGraph == null)
return null;
var Result = await MsGraph.RequestListAsync(strUrl, UseBeta: false, retryForbidden: false);
if (Result != null == Result.Count > 0)
{
var searchResult = new List<cF4sdApiSearchResultRelation>(Result.Count);
foreach (var Entry in Result)
{
var endDate = DateTime.MinValue;
if (!DateTime.TryParse(Entry.Result.lastSyncDateTime?.ToString(), out endDate))
endDate = DateTime.UtcNow;
var searchInfo = new cF4sdApiSearchResultRelation()
{
Type = enumF4sdSearchResultClass.MobileDevice,
@@ -2677,6 +2710,9 @@ namespace C4IT.DataHistoryProvider
case "GetLAPS":
result = await GetLAPS(jsonRequest.Identities, requestInfo, CancellationToken.None);
break;
case "GetTAP":
result = await GetTAP(jsonRequest.Identities, requestInfo, CancellationToken.None);
break;
case "GetBitlockerKeyTest":
result = await GetBitlockerKeyTest(jsonRequest.Identities, requestInfo, CancellationToken.None);
break;
@@ -2688,7 +2724,7 @@ namespace C4IT.DataHistoryProvider
}
public override async Task<List<string>> GetQuickActionList()
{
var HasIntuneConfig = (Collector.InfrastructureConfig.AzureTenants?.Values.Any(t => t.ScanIntuneDevices) == true);
if (HasIntuneConfig)
@@ -2699,8 +2735,9 @@ namespace C4IT.DataHistoryProvider
"Get Managed Apps",
"Get BitlockerKey",
"Get LAPS",
"Get TAP",
"GetLapsKeyTest",
};
};
return await Task.FromResult(quickactions);
}
var result = new List<string>();
@@ -2827,6 +2864,40 @@ namespace C4IT.DataHistoryProvider
return null;
}
public async Task<dynamic> GetTAP(List<cF4sdIdentityEntry> identities, cF4sdWebRequestInfo requestInfo, CancellationToken Token)
{
var Ids = await Collector.getConntectorIds(identities, Token, requestInfo, 1);
if (!Ids.TryGetValue(enumFasdInformationClass.User, out var _ids))
return null;
var strUrl = string.Format(constMsGraphTAP, _ids.intuneId);
var MsGraph = await GetGraphForTenantAsync(_ids.tenantId, true);
if (MsGraph == null)
return null;
var IntuneConfig = Collector?.GetGlobalConfig()?.IntuneConfiguration;
var body = new Dictionary<string, object>()
{
{ "isUsableOnce", IntuneConfig?.TAPIsUsableOnce ?? cF4sdIntuneConfig.DefaultTAPIsUsableOnce},
{ "lifetimeInMinutes", IntuneConfig?.TAPLifeTimeInMinutes ?? cF4sdIntuneConfig.DefaultTAPLifeTimeInMinutes}
};
var Result = await MsGraph.RequestAsync(strUrl, UseBeta: false, eHttpMethod.post, JsonData: body, retryForbidden: false);
if (Result != null)
{
var _resultJson = Result.Result as JObject;
if (_resultJson != null)
{
return _resultJson;
}
}
return null;
}
public async Task<dynamic> GetManagedApps(List<cF4sdIdentityEntry> identities, cF4sdWebRequestInfo requestInfo, CancellationToken Token)
{
var Ids = await Collector.getConntectorIds(identities, Token, requestInfo, 1);
@@ -3131,6 +3202,9 @@ namespace C4IT.DataHistoryProvider
if (Collector.InfrastructureConfig.AzureTenants != null)
await DoAzureScanAsync(requestInfo, LogDeep + 1, Token);
if (Collector.InfrastructureConfig.AzureTenants?.Values.Any(t => t.ScanIntuneDevices) == true)
await DoScanIntuneAsync(requestInfo, LogDeep + 1, Token);
await Collector.SetLastScanTime("AdScan-all", DateTime.UtcNow, requestInfo, LogDeep + 1, Token);
return true;
@@ -3443,7 +3517,7 @@ namespace C4IT.DataHistoryProvider
if (Table?.ParentCluster?.Origin == enumDataHistoryOrigin.Intune)
return true;
return false;
}
}
private object ConvertToF4sdType(object objVal, enumFasdValueType ValueType)
{
@@ -3691,68 +3765,26 @@ namespace C4IT.DataHistoryProvider
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
if (Collector?.InfrastructureConfig?.Authorisation?.MembershipGroups?.GroupsAd == null)
if (Collector?.InfrastructureConfig?.Authorisation?.MembershipGroups?.GroupsAd is null)
return;
LogEntry("Resolving AD groups SIDs...");
var _lstDomains = Collector.InfrastructureConfig.Authorisation.MembershipGroups.GroupsAd;
var domains = Collector.InfrastructureConfig.Authorisation.MembershipGroups.GroupsAd.Values;
LogEntry("Resolving AD groups SIDs finished");
foreach (var _domain in _lstDomains.Values)
bool hasResolved = true;
foreach (cF4SDMembershipGroupsAd domain in domains)
{
try
{
LogEntry($"Start processing domain");
LogEntry($"Processing domain {_domain?.Domain?.FQDN}");
PrincipalContext PC;
if (_domain.Domain.Credential == null)
PC = new PrincipalContext(ContextType.Domain, _domain.Domain.FQDN);
else
PC = new PrincipalContext(ContextType.Domain, _domain.Domain.FQDN, _domain.Domain.Credential.User, _domain.Domain.Credential.NwCredential.Password);
LogEntry($"Principal context successful created");
foreach (var _group in _domain.Values)
{
try
{
LogEntry($"Start processing group.");
LogEntry($"Group: {_group.Name}.");
var GI = GroupPrincipal.FindByIdentity(PC, IdentityType.SamAccountName, _group.Account);
LogEntry($"Group principal found");
LogEntry($"GI.SID: {GI.Sid.ToString()}");
if (GI != null)
if (GI.Sid != null)
{
_group.SID = GI.Sid.ToString();
LogEntry($"AD group '{_group.Account}' in domain '{_domain.Domain.FQDN}' resolved. SID = {_group.SID}");
}
if (_group.SID == null)
LogEntry($"Could not resolve AD group '{_group.Account}' in domain '{_domain.Domain.FQDN}'", LogLevels.Warning);
}
catch (Exception E)
{
LogException(E);
}
finally
{
LogEntry($"End processing group.");
}
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
LogEntry($"End processing domain");
}
hasResolved = hasResolved && TryProcessDomain(domain);
}
WinAuthenticationGropsResolved = hasResolved;
}
catch (Exception E)
catch (Exception ex)
{
LogException(E);
LogException(ex);
WinAuthenticationGropsResolved = false;
}
finally
{
@@ -3760,6 +3792,80 @@ namespace C4IT.DataHistoryProvider
}
}
private bool TryProcessDomain(cF4SDMembershipGroupsAd domain)
{
try
{
bool hasProcessed = true;
if (domain?.Domain is null)
return hasProcessed;
LogEntry($"Start processing domain");
string domainName = domain.Domain.FQDN;
LogEntry($"Processing domain {domainName}");
PrincipalContext principalContext;
if (domain.Domain.Credential == null)
principalContext = new PrincipalContext(ContextType.Domain, domainName);
else
principalContext = new PrincipalContext(ContextType.Domain, domainName, domain.Domain.Credential.User, domain.Domain.Credential.NwCredential.Password);
LogEntry($"Principal context successful created");
foreach (var group in domain.Values)
{
hasProcessed = hasProcessed && TryProcessMembershipGroup(group, principalContext, domainName);
}
return hasProcessed;
}
catch (Exception ex)
{
LogException(ex);
return false;
}
finally
{
LogEntry($"End processing domain");
}
}
private bool TryProcessMembershipGroup(cF4SDMembershipGroupAd group, PrincipalContext principalContext, string domainName)
{
try
{
if (group is null)
return true;
LogEntry($"Start processing group.");
LogEntry($"Group: {group.Name}.");
var groupIdentity = GroupPrincipal.FindByIdentity(principalContext, IdentityType.SamAccountName, group.Account);
LogEntry($"Group principal found");
LogEntry($"GI.SID: {groupIdentity.Sid}");
if (groupIdentity?.Sid != null)
{
group.SID = groupIdentity.Sid.ToString();
LogEntry($"AD group '{group.Account}' in domain '{domainName}' resolved. SID = {group.SID}");
}
if (group.SID == null)
LogEntry($"Could not resolve AD group '{group.Account}' in domain '{domainName}'", LogLevels.Warning);
return true;
}
catch (Exception ex)
{
LogException(ex);
return false;
}
finally
{
LogEntry($"End processing group.");
}
}
static public Guid ConvertAzureSidToGuid(string sid)
{
if (!sid.StartsWith("S-1-12-1-"))

View File

@@ -592,7 +592,6 @@ namespace C4IT.DataHistoryProvider
// check if wwe have a local account and process the localAccountAssignments
if (string.IsNullOrEmpty(domain) && localAccountAssignments != null)
{
var AdId = Guid.Empty;
foreach (var localAccountAssignment in localAccountAssignments)
{

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +1,16 @@
using C4IT.FASD.Base;
using C4IT.Logging;
using C4IT.Security;
using System;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using C4IT.FASD.Base;
using C4IT.Logging;
using C4IT.Security;
using Newtonsoft.Json.Linq;
using static C4IT.DataHistoryProvider.cDataHistoryCollectorTokenCache;
using static C4IT.Logging.cLogManager;
namespace C4IT.DataHistoryProvider
@@ -29,6 +34,7 @@ namespace C4IT.DataHistoryProvider
public string secret;
public DateTime validUntil;
public DateTime renewUntil;
public string IdRemote;
public bool IsValid()
{
@@ -36,6 +42,7 @@ namespace C4IT.DataHistoryProvider
return false;
if (validUntil < DateTime.UtcNow + TimeSpan.FromMinutes(cDataHistoryCollector.constMinutesUntilTokenIsInvalid))
return false;
return true;
}
@@ -52,7 +59,8 @@ namespace C4IT.DataHistoryProvider
name2 = name2,
secret = _sec,
validUntil = validUntil,
renewUntil = renewUntil
renewUntil = renewUntil,
IdRemote = IdRemote
};
return _ret;
@@ -132,6 +140,9 @@ namespace C4IT.DataHistoryProvider
{
dicToken.Clear();
var _toDelete = new List<cTokenInfo>();
var _toUpdate = new List<cTokenInfo>();
using (var _reader = await DataHistorySqlHelper.GetDataReaderAsync(DbConn, Query, null, Token))
{
if (_reader != null)
@@ -139,7 +150,6 @@ namespace C4IT.DataHistoryProvider
{
if (_reader.HasRows)
{
var _toDelete = new List<cTokenInfo>();
while (await _reader.ReadAsync())
{
try
@@ -156,13 +166,22 @@ namespace C4IT.DataHistoryProvider
_entry.secret = cSecurePassword.Instance.Decode(_secret);
_entry.validUntil = _reader.IsDBNull(5) ? DateTime.MinValue : _reader.GetDateTime(5);
_entry.renewUntil = _reader.IsDBNull(6) ? DateTime.MinValue : _reader.GetDateTime(6);
_entry.IdRemote = _reader.IsDBNull(7) ? null : _reader.GetString(7);
int valid = -1;
if (_entry.IsValid())
valid = await Collector.ValidateTokenInfo(_entry);
if (valid < 0)
_toDelete.Add(_entry);
else
{
if (!privInsert(_entry, false))
_toDelete.Add(_entry);
if (valid > 0)
_toUpdate.Add(_entry);
}
else
_toDelete.Add(_entry);
}
catch (Exception E)
{
@@ -178,9 +197,18 @@ namespace C4IT.DataHistoryProvider
{
cLogManager.DefaultLogger.LogException(E);
}
}
if (_toUpdate.Count > 0)
{
foreach (var entry in _toUpdate)
{
var _secEnc = entry.secret;
if (!HasTokenTypeLongLifetime(entry.type))
_secEnc = cSecurePassword.Instance.Encode(entry.secret);
await SaveToDbAsync(entry, _secEnc, requestInfo, LogDeep + 1, Token);
}
}
}
catch (Exception E)
{
@@ -204,6 +232,54 @@ namespace C4IT.DataHistoryProvider
}
}
private async Task SaveToDbAsync(cTokenInfo _tokenInfo, string secEnc, cF4sdWebRequestInfo requestInfo, int LogDeep, CancellationToken Token)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
var sqlerror = 0;
var sqlStartTime = DateTime.UtcNow;
if (!DataHistorySqlHelper.GetWellKnownSqlStatement("InsertOrUpdateExternalToken", out var Query))
return;
try
{
var Params = new Dictionary<string, object>()
{
{ "Id", _tokenInfo.id },
{ "Type", (int)_tokenInfo.type },
{ "Name", _tokenInfo.name },
{ "Name2", _tokenInfo.name2 },
{ "Secret", secEnc },
{ "ValidUntil", _tokenInfo.validUntil },
{ "RenewUntil", _tokenInfo.renewUntil },
{ "IdRemote", _tokenInfo.IdRemote },
};
using (var Conn = new cDbConnection(Collector.mainDbConnection))
{
if (!Conn.IsOpen)
{
LogEntry($"Could not open main database '{Collector.mainDbConnection.Database}', aborting query'", LogLevels.Error);
return;
}
await DataHistorySqlHelper.ExecuteAsync(Conn, Query, Params, requestInfo, Token);
}
}
catch (Exception E)
{
sqlerror = E.HResult;
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
}
public async Task SetAsync(cF4SDTokenRegistration _tokenRegistration, cF4SDTokenValidityPeriod validityPeriod, CancellationToken Token, cF4sdWebRequestInfo requestInfo, int LogDeep)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
@@ -229,50 +305,23 @@ namespace C4IT.DataHistoryProvider
renewUntil = validityPeriod.renewUntil
};
if (!DataHistorySqlHelper.GetWellKnownSqlStatement("InsertOrUpdateExternalToken", out var Query))
return;
var Params = new Dictionary<string, object>()
{
{ "Id", _tokenInfo.id },
{ "Type", (int)_tokenInfo.type },
{ "Name", _tokenInfo.name },
{ "Name2", _tokenInfo.name2 },
{ "Secret", _secEnc },
{ "ValidUntil", _tokenInfo.validUntil },
{ "RenewUntil", _tokenInfo.renewUntil },
};
var sqlerror = 0;
var sqlStartTime = DateTime.UtcNow;
await TokenCacheCriticalSection.EnterAsync();
try
{
await SaveToDbAsync(_tokenInfo, _secEnc, requestInfo, LogDeep + 1, Token);
privInsert(_tokenInfo, true);
using (var Conn = new cDbConnection(Collector.mainDbConnection))
{
if (!Conn.IsOpen)
{
LogEntry($"Could not open main database '{Collector.mainDbConnection.Database}', aborting query'", LogLevels.Error);
return;
}
await DataHistorySqlHelper.ExecuteAsync(Conn, Query, Params, requestInfo, Token);
}
}
catch (Exception E)
{
sqlerror = E.HResult;
LogException(E);
}
finally
{
TokenCacheCriticalSection.Leave();
}
}
catch (Exception E)
{

View File

@@ -1,188 +0,0 @@
using C4IT.DataHistoryProvider;
using C4IT.Logging;
using C4IT.Security;
using C4IT.XML;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Xml;
using static C4IT.Logging.cLogManager;
namespace C4IT_DataHistoryProvider
{
public class cDataHistoryConfigCitrix : IConfigNodeValidation
{
public bool IsValid { get; private set; } = false;
public string Domain { get; private set; } = "";
public string TenantID { get; private set; } = String.Empty;
public cCredential Credential { get; private set; } = null;
public cDataHistoryScanTiming ScanTiming { get; private set; } = null;
public cDataHistoryConfigCitrix(XmlElement XNode, Dictionary<string, cCredential> Credentials, cXmlParser Parser)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
var XNode2 = XNode.SelectSingleNode("Citrix");
if (!(XNode2 is XmlElement XCitrix))
{
return;
}
Parser.EnterElement("Citrix");
try
{
ScanTiming = new cDataHistoryScanTiming(XCitrix, TimeSpan.FromHours(24), TimeSpan.FromMinutes(10), Parser);
IsValid = true;
}
finally
{
Parser.LeaveElement("Citrix");
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
}
public class cDataHistoryCitrixTenant : IConfigNodeValidation
{
public bool IsValid { get; private set; } = false;
public string Domain { get; private set; } = "";
public string TenantID { get; private set; } = String.Empty;
public string InstanceID { get; private set; } = String.Empty;
public cCredential Credential { get; private set; } = null;
internal cDataHistoryCitrixTenant(XmlElement XNode, Dictionary<string, cCredential> Credentials, cXmlParser Parser)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
Domain = cXmlParser.GetStringFromXmlAttribute(XNode, "Domain");
if (string.IsNullOrWhiteSpace(Domain))
{
Parser.AddInvalidAttribute(XNode, null, "Domain");
return;
}
TenantID = cXmlParser.GetStringFromXmlAttribute(XNode, "TenantID");
if (TenantID == String.Empty)
{
Parser.AddInvalidAttribute(XNode, Domain, "TenantID");
return;
}
InstanceID = cXmlParser.GetStringFromXmlAttribute(XNode, "InstanceID");
if (InstanceID == String.Empty)
{
Parser.AddInvalidAttribute(XNode, Domain, "InstanceID");
return;
}
var strCreds = cXmlParser.GetStringFromXmlAttribute(XNode, "Credential");
if (!string.IsNullOrWhiteSpace(strCreds))
{
if (Credentials.TryGetValue(strCreds, out var Cred))
Credential = Cred;
}
if (Credential == null)
{
Parser.AddInvalidAttribute(XNode, Domain, "Credential");
return;
}
IsValid = true;
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
}
internal static Dictionary<string, cDataHistoryCitrixTenant> LoadFromXml(XmlElement XNode, Dictionary<string, cCredential> Credentials, cXmlParser Parser)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
var RetVal = new Dictionary<string, cDataHistoryCitrixTenant>();
try
{
var XRoot = XNode.SelectSingleNode("Citrix");
if (XRoot == null)
{
return null;
}
Parser.EnterElement("Citrix");
try
{
var XList = XRoot.SelectNodes("Citrix-Tenant");
if (XList != null && XList.Count > 0)
{
Parser.EnterElement("Citrix-Tenant");
try
{
foreach (var Entry in XList)
{
if (!(Entry is XmlElement XEntry))
continue;
var Node = new cDataHistoryCitrixTenant(XEntry, Credentials, Parser);
if (Node.IsValid)
{
if (RetVal.ContainsKey(Node.Domain))
{
Parser.AddDuplicateName(XEntry, Node.Domain, LogLevels.Warning);
}
else
RetVal.Add(Node.Domain, Node);
}
Parser.SelectElementNext();
}
}
finally
{
Parser.LeaveElement("Citrix-Tenant");
}
}
}
finally
{
Parser.LeaveElement("Citrix");
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
return RetVal;
}
}
}
}

View File

@@ -128,6 +128,8 @@ namespace C4IT.DataHistoryProvider
RetVal |= DoXmlInsertTableRow(XmlRoot, "AD-ComputerInfo", "ad-computer", "<Table-Column Name=\"domainDns\" SourceType =\"Static\" Type=\"string\" Cardinal=\"128\"/>", "account");
RetVal |= DoXmlInsertTableRow(XmlRoot, "AD-ComputerInfo", "ad-computer", "<Table-Column Name=\"domainNB\" SourceType =\"Static\" Type=\"string\" Cardinal=\"16\"/>", "account");
RetVal |= DoXmlInsertTableRow(XmlRoot, "Agent-DeviceInfo", "agnt-computer", "<Table-Column Name=\"IsPhoenixInstalled\" SourceName=\"Phoenix Installed\" Type=\"boolean\" Aggregation=\"latestValue\"/>");
RetVal |= DoXmlInsertTableRow(XmlRoot, "Agent-DeviceInfo", "agnt-computer-event-numerical", "<Table-Column Name=\"DeviceActivity\" SourceName=\"Device Activity\" Type=\"bigint\" Aggregation=\"sum\"/>");
RetVal |= DoXmlInsertTableRow(XmlRoot, "Agent-DeviceInfo", "agnt-computer-event-numerical", "<Table-Column Name=\"UserActivity\" SourceName=\"User Activity\" Type=\"bigint\" Aggregation=\"sum\"/>");
RetVal |= DoXmlInsertTableRow(XmlRoot, "Agent-DeviceInfo", "agnt-computer-event-numerical", "<Table-Column Name=\"ProcessorTaskManager\" SourceName=\"Task Manager % Score\" Type=\"float\" Aggregation=\"average\" LateDelivery=\"true\" />");
@@ -248,6 +250,11 @@ namespace C4IT.DataHistoryProvider
, "<Table Name=\"citrix-session-metrics\" Type=\"History\" Key=\"Id\"><Table-Columns><Table-Column Name=\"Id\" Type=\"int\"/><Table-Column Name=\"CollectedDate\" Type=\"datetime\"/><Table-Column Name=\"IcaRttMS\" Type=\"int\" Aggregation=\"average\"/><Table-Column Name=\"IcaLatency\" Type=\"int\" Aggregation=\"average\"/><Table-Column Name=\"ClientL7Latency\" Type=\"int\" Aggregation=\"average\"/><Table-Column Name=\"ServerL7Latency\" Type=\"int\" Aggregation=\"average\"/><Table-Column Name=\"ConnectionState\" Type=\"int\" Aggregation=\"average\"/><Table-Column Name=\"InputBandwidthUsed\" Type=\"int\" Aggregation=\"average\"/><Table-Column Name=\"OutputBandwidthUsed\" Type=\"int\" Aggregation=\"average\"/><Table-Column Name=\"OutputBandwidthAvailable\" Type=\"int\" Aggregation=\"average\"/><Table-Column Name=\"Fps\" Type=\"int\" Aggregation=\"average\"/><Table-Column Name=\"InputFps\" Type=\"int\" Aggregation=\"average\"/><Table-Column Name=\"OutputFps\" Type=\"int\" Aggregation=\"average\"/><Table-Column Name=\"WanLatency\" Type=\"int\" Aggregation=\"average\"/><Table-Column Name=\"DcLatency\" Type=\"int\" Aggregation=\"average\"/></Table-Columns></Table>"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "DataCluster[@Name='citrixMetrics']"
, "Table[@Name='citrix-connectionState-metrics']"
, "<Table Name=\"citrix-connectionState-metrics\" Type=\"History\" Key=\"Id\"><Table-Columns><Table-Column Name=\"Id\" Type=\"int\" /><Table-Column Name=\"StartDate\" Type=\"datetime\" /><Table-Column Name=\"ConnectionState\" Type=\"int\" /><Table-Column Name=\"ConnectionCount\" Type=\"int\" /></Table-Columns></Table>");
RetVal |= DoXmlInsertElement(XmlRoot
, "DataCluster[@Name='citrixMetrics']"
, "Table[@Name='citrix-session-details-icaRttMS']"
@@ -277,6 +284,10 @@ namespace C4IT.DataHistoryProvider
, "Table[@Name='citrix-session-details-inputBandwidthUsed']"
, "<Table Name=\"citrix-session-details-inputBandwidthUsed\" Type=\"Events\" Key=\"Id\" EventTimeCol=\"time\"><Table-Columns><Table-Column Name=\"Id\" Type=\"int\"/><Table-Column Name=\"Value\" SourceName=\"InputBandwidthUsed\" Type=\"int\"/><Table-Column Name=\"time\" SourceName=\"CollectedDate\" Type=\"datetime\"/></Table-Columns></Table>"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "DataCluster[@Name='citrixMetrics']"
, "Table[@Name='citrix-session-details-outputBandwidthUsed']"
, "<Table Name=\"citrix-session-details-outputBandwidthUsed\" Type=\"Events\" Key=\"Id\" EventTimeCol=\"time\"><Table-Columns><Table-Column Name=\"Id\" Type=\"int\" /><Table-Column Name=\"Value\" SourceName=\"OutputBandwidthUsed\" Type=\"int\" /><Table-Column Name=\"time\" SourceName=\"CollectedDate\" Type=\"datetime\" /></Table-Columns></Table>");
RetVal |= DoXmlInsertElement(XmlRoot
, "DataCluster[@Name='citrixMetrics']"
@@ -317,8 +328,7 @@ namespace C4IT.DataHistoryProvider
RetVal |= DoXmlInsertElement(XmlRoot
, "DataCluster[@Name='citrixMetrics']"
, "Table[@Name='citrix-session-machine']"
, "<Table Name=\"citrix-session-machine\" Type=\"Static\" Key=\"Id\"><Table-Columns><Table-Column Name=\"Id\" Type=\"guid\"/><Table-Column Name=\"Name\" Type=\"string\"/><Table-Column Name=\"CatalogName\" SourceName=\"Catalog\" SourceJsonField=\"Name\" Type=\"string\" Default=\"0\"/><Table-Column Name=\"AllocationType\" SourceName=\"Catalog\" SourceJsonField=\"AllocationType\" Type=\"int\" Default=\"0\"/><Table-Column Name=\"DesktopGroupName\" SourceName=\"DesktopGroup\" SourceJsonField=\"Name\" Type=\"string\"/><Table-Column Name=\"DnsName\" Type=\"string\"/><Table-Column Name=\"HostedMachine\" SourceName=\"HostedMachineId\" Type=\"string\"/><Table-Column Name=\"IPAddress\" Type=\"string\"/><Table-Column Name=\"WindowsConnectionSetting\" Type=\"int\" Default=\"0\"/><Table-Column Name=\"CurrentRegistrationState\" Type=\"int\" Default=\"0\"/><Table-Column Name=\"AgentVersion\" Type=\"string\"/><Table-Column Name=\"CurrentSessionCount\" Type=\"int\"/><Table-Column Name=\"OSType\" Type=\"string\"/><Table-Column Name=\"IsInMaintenanceMode\" Type=\"boolean\"/><Table-Column Name=\"Cpu\" SourceName=\"CurrentLoadIndex\" SourceJsonField=\"Cpu\" Type=\"int\" Default=\"0\"/><Table-Column Name=\"Memory\" SourceName=\"CurrentLoadIndex\" SourceJsonField=\"Memory\" Type=\"int\" Default=\"0\"/><Table-Column Name=\"Disk\" SourceName=\"CurrentLoadIndex\" SourceJsonField=\"Disk\" Type=\"int\" Default=\"0\"/></Table-Columns></Table>"
);
, "<Table Name=\"citrix-session-machine\" Type=\"Static\" Key=\"Id\"><Table-Columns><Table-Column Name=\"Id\" Type=\"guid\" /><Table-Column Name=\"Name\" Type=\"string\" /><Table-Column Name=\"CatalogName\" SourceName=\"Catalog\" SourceJsonField=\"Name\" Type=\"string\" Default=\"0\" /><Table-Column Name=\"AllocationType\" SourceName=\"Catalog\" SourceJsonField=\"AllocationType\" Type=\"int\" Default=\"0\" /><Table-Column Name=\"DesktopGroupName\" SourceName=\"DesktopGroup\" SourceJsonField=\"Name\" Type=\"string\" /><Table-Column Name=\"DnsName\" Type=\"string\" /><Table-Column Name=\"HostedMachine\" SourceName=\"HostedMachineId\" Type=\"string\" /><Table-Column Name=\"IPAddress\" Type=\"string\" /><Table-Column Name=\"WindowsConnectionSetting\" Type=\"int\" Default=\"0\" /><Table-Column Name=\"CurrentRegistrationState\" Type=\"int\" Default=\"0\" /><Table-Column Name=\"AgentVersion\" Type=\"string\" /><Table-Column Name=\"CurrentSessionCount\" Type=\"int\" /><Table-Column Name=\"OSType\" Type=\"string\" /><Table-Column Name=\"IsInMaintenanceMode\" Type=\"boolean\" /><Table-Column Name=\"Cpu\" SourceName=\"CurrentLoadIndex\" SourceJsonField=\"Cpu\" Type=\"int\" Default=\"0\" /><Table-Column Name=\"Memory\" SourceName=\"CurrentLoadIndex\" SourceJsonField=\"Memory\" Type=\"int\" Default=\"0\" /><Table-Column Name=\"Disk\" SourceName=\"CurrentLoadIndex\" SourceJsonField=\"Disk\" Type=\"int\" Default=\"0\" /></Table-Columns></Table>");
RetVal |= DoXmlInsertElement(XmlRoot
, "DataCluster[@Name='citrixMetrics']"
@@ -378,19 +388,19 @@ namespace C4IT.DataHistoryProvider
, "Table[@Name='M42Wpm-Ticket-Services']"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "DataCluster[@Name='M42Tickets']"
, "Table[@Name='M42Wpm-Ticket-QuickCalls']"
, "<Table Name=\"M42Wpm-Ticket-QuickCalls\" Type=\"Selection\" Key=\"id\"><Matrix42-DataQueryItems-Template EntityClassName=\"SPSQuickCallClassBase\" EntityTypeNames=\"SPSQuickCallType\" OrderBy=\"\" WhereExpression=\"Restricted = 0\" DataQueryName=\"C4IT - F4SD - Quick Calls\"/><Table-Columns><Table-Column Name=\"id\" SourceName=\"Id\" Type=\"guid\"/><Table-Column Name=\"SysObjectId\" SourceName=\"Sys-ObjectId\" Type=\"guid\"/><Table-Column Name=\"SysName\" SourceName=\"Sys-Name\" Type=\"string\" Cardinal=\"50\"/><Table-Column Name=\"Name\" Type=\"string\" Cardinal=\"300\"/><Table-Column Name=\"Subject\" Type=\"string\" Cardinal=\"1024\"/><Table-Column Name=\"Priority\" Type=\"string\" Cardinal=\"100\"/><Table-Column Name=\"Responsible\" Type=\"string\" Cardinal=\"300\"/><Table-Column Name=\"ResponsibleRole\" Type=\"string\" Cardinal=\"300\"/><Table-Column Name=\"Category\" SourceName=\"Category_Value\" Type=\"guid\"/></Table-Columns></Table>"
, "Table[@Name='M42Wpm-Ticket-Assets']"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "DataCluster[@Name='M42Tickets']"
, "Table[@Name='M42Wpm-Ticket-QuickCalls']"
, "<Table Name=\"M42Wpm-Ticket-QuickCalls\" Type=\"Selection\" Key=\"id\"><Matrix42-DataQueryItems-Template EntityClassName=\"SPSQuickCallClassBase\" EntityTypeNames=\"SPSQuickCallType\" OrderBy=\"\" WhereExpression=\"Restricted = 0\" DataQueryName=\"C4IT - F4SD - Quick Calls\"/><Table-Columns><Table-Column Name=\"id\" SourceName=\"Id\" Type=\"guid\"/><Table-Column Name=\"SysObjectId\" SourceName=\"Sys-ObjectId\" Type=\"guid\"/><Table-Column Name=\"SysName\" SourceName=\"Sys-Name\" Type=\"string\" Cardinal=\"50\"/><Table-Column Name=\"Name\" Type=\"string\" Cardinal=\"300\"/><Table-Column Name=\"Subject\" Type=\"string\" Cardinal=\"1024\"/><Table-Column Name=\"Priority\" Type=\"string\" Cardinal=\"100\"/><Table-Column Name=\"Responsible\" Type=\"string\" Cardinal=\"300\"/><Table-Column Name=\"ResponsibleRole\" Type=\"string\" Cardinal=\"300\"/><Table-Column Name=\"Category\" SourceName=\"Category_Value\" Type=\"guid\"/></Table-Columns></Table>"
, "Table[@Name='M42Wpm-Ticket-Assets']"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "DataCluster[@Name='M42Tickets']"
, "Table[@Name='M42Wpm-Ticket-Categories']"
, "<Table Name=\"M42Wpm-Ticket-Categories\" Type=\"Selection\" Key=\"id\"><Matrix42-DataQueryItems-Template EntityClassName=\"SPSScCategoryClassBase\" EntityTypeNames=\"SPSScCategoryType\" OrderBy=\"\" WhereExpression=\"Hidden = 0\"/><Table-Columns><Table-Column Name=\"id\" SourceName=\"Id\" Type=\"guid\"/><Table-Column Name=\"SysObjectId\" SourceName=\"Sys-ObjectId\" Type=\"guid\"/><Table-Column Name=\"SysName\" SourceName=\"Sys-Name\" Type=\"string\" Cardinal=\"50\"/><Table-Column Name=\"Name\" Type=\"string\" Cardinal=\"300\"/><Table-Column Name=\"parentValue\" SourceName=\"Parent_Value\" Type=\"guid\"/><Table-Column Name=\"parent\" SourceName=\"Parent\" Type=\"string\" Cardinal=\"300\"/></Table-Columns></Table>"
, "Table[@Name='M42Wpm-Ticket-QuickCalls']"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "DataCluster[@Name='M42Tickets']"
, "Table[@Name='M42Wpm-Ticket-Categories']"
, "<Table Name=\"M42Wpm-Ticket-Categories\" Type=\"Selection\" Key=\"id\"><Matrix42-DataQueryItems-Template EntityClassName=\"SPSScCategoryClassBase\" EntityTypeNames=\"SPSScCategoryType\" OrderBy=\"\" WhereExpression=\"Hidden = 0\"/><Table-Columns><Table-Column Name=\"id\" SourceName=\"Id\" Type=\"guid\"/><Table-Column Name=\"SysObjectId\" SourceName=\"Sys-ObjectId\" Type=\"guid\"/><Table-Column Name=\"SysName\" SourceName=\"Sys-Name\" Type=\"string\" Cardinal=\"50\"/><Table-Column Name=\"Name\" Type=\"string\" Cardinal=\"300\"/><Table-Column Name=\"parentValue\" SourceName=\"Parent_Value\" Type=\"guid\"/><Table-Column Name=\"parent\" SourceName=\"Parent\" Type=\"string\" Cardinal=\"300\"/></Table-Columns></Table>"
, "Table[@Name='M42Wpm-Ticket-QuickCalls']"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "DataCluster[@Name='M42Tickets']"
@@ -493,83 +503,96 @@ namespace C4IT.DataHistoryProvider
}
// update table 'M42Wpm-Tickets' columns
RetVal |= DoXmlInsertTableRow(XmlRoot, "M42Tickets", "M42Wpm-Tickets", "<Table-Column Name=\"Urgency\" Type=\"string\" Cardinal=\"64\"/>", "AffectedUser");
RetVal |= DoXmlInsertTableRow(XmlRoot, "M42Tickets", "M42Wpm-Tickets", "<Table-Column Name=\"UrgencyId\" Type=\"int\"/>", "Urgency");
RetVal |= DoXmlInsertTableRow(XmlRoot, "M42Tickets", "M42Wpm-Tickets", "<Table-Column Name=\"Impact\" Type=\"string\" Cardinal=\"64\"/>", "UrgencyId");
RetVal |= DoXmlInsertTableRow(XmlRoot, "M42Tickets", "M42Wpm-Tickets", "<Table-Column Name=\"ImpactId\" Type=\"int\"/>", "Impact");
RetVal |= DoXmlInsertTableRow(XmlRoot, "M42Tickets", "M42Wpm-Ticket-QuickCalls", "<Table-Column Name=\"Category\" SourceName=\"Category_Value\" Type=\"guid\" />", "ResponsibleRole");
var quickCallsCategoryColumn = XmlRoot.SelectSingleNode("DataCluster[@Name='M42Tickets']/Table[@Name='M42Wpm-Ticket-QuickCalls']/Table-Columns/Table-Column[@Name='Category']") as XmlElement;
if (quickCallsCategoryColumn != null)
{
if (!string.Equals(quickCallsCategoryColumn.GetAttribute("SourceName"), "Category_Value", StringComparison.OrdinalIgnoreCase))
{
quickCallsCategoryColumn.SetAttribute("SourceName", "Category_Value");
RetVal = true;
}
if (!string.Equals(quickCallsCategoryColumn.GetAttribute("Type"), "guid", StringComparison.OrdinalIgnoreCase))
{
quickCallsCategoryColumn.SetAttribute("Type", "guid");
RetVal = true;
}
}
var quickCallsTemplate = XmlRoot.SelectSingleNode("DataCluster[@Name='M42Tickets']/Table[@Name='M42Wpm-Ticket-QuickCalls']/Matrix42-DataQueryItems-Template") as XmlElement;
if (quickCallsTemplate != null)
{
if (!string.Equals(quickCallsTemplate.GetAttribute("DataQueryName"), "C4IT - F4SD - Quick Calls", StringComparison.OrdinalIgnoreCase))
{
quickCallsTemplate.SetAttribute("DataQueryName", "C4IT - F4SD - Quick Calls");
RetVal = true;
}
}
var categoriesColumns = XmlRoot.SelectSingleNode("DataCluster[@Name='M42Tickets']/Table[@Name='M42Wpm-Ticket-Categories']/Table-Columns") as XmlElement;
if (categoriesColumns != null)
{
RetVal |= DoXmlInsertTableRow(XmlRoot, "M42Tickets", "M42Wpm-Ticket-Categories", "<Table-Column Name=\"parentValue\" SourceName=\"Parent_Value\" Type=\"guid\" />", "Name");
RetVal |= DoXmlInsertTableRow(XmlRoot, "M42Tickets", "M42Wpm-Ticket-Categories", "<Table-Column Name=\"parent\" SourceName=\"Parent\" Type=\"string\" Cardinal=\"300\" />", "parentValue");
var parentValueColumn = categoriesColumns.SelectSingleNode("Table-Column[@Name='parentValue']") as XmlElement;
if (parentValueColumn != null)
{
if (!string.Equals(parentValueColumn.GetAttribute("SourceName"), "Parent_Value", StringComparison.OrdinalIgnoreCase))
{
parentValueColumn.SetAttribute("SourceName", "Parent_Value");
RetVal = true;
}
if (!string.Equals(parentValueColumn.GetAttribute("Type"), "guid", StringComparison.OrdinalIgnoreCase))
{
parentValueColumn.SetAttribute("Type", "guid");
RetVal = true;
}
}
var parentColumn = categoriesColumns.SelectSingleNode("Table-Column[@Name='parent']") as XmlElement;
if (parentColumn != null)
{
if (!string.Equals(parentColumn.GetAttribute("SourceName"), "Parent", StringComparison.OrdinalIgnoreCase))
{
parentColumn.SetAttribute("SourceName", "Parent");
RetVal = true;
}
if (!string.Equals(parentColumn.GetAttribute("Type"), "string", StringComparison.OrdinalIgnoreCase))
{
parentColumn.SetAttribute("Type", "string");
RetVal = true;
}
if (!string.Equals(parentColumn.GetAttribute("Cardinal"), "300", StringComparison.OrdinalIgnoreCase))
{
parentColumn.SetAttribute("Cardinal", "300");
RetVal = true;
}
}
}
RetVal |= DoXmlInsertTableRow(XmlRoot, "M42Tickets", "M42Wpm-Tickets", "<Table-Column Name=\"Urgency\" Type=\"string\" Cardinal=\"64\"/>", "AffectedUser");
RetVal |= DoXmlInsertTableRow(XmlRoot, "M42Tickets", "M42Wpm-Tickets", "<Table-Column Name=\"UrgencyId\" Type=\"int\"/>", "Urgency");
RetVal |= DoXmlInsertTableRow(XmlRoot, "M42Tickets", "M42Wpm-Tickets", "<Table-Column Name=\"Impact\" Type=\"string\" Cardinal=\"64\"/>", "UrgencyId");
RetVal |= DoXmlInsertTableRow(XmlRoot, "M42Tickets", "M42Wpm-Tickets", "<Table-Column Name=\"ImpactId\" Type=\"int\"/>", "Impact");
RetVal |= DoXmlInsertTableRow(XmlRoot, "M42Tickets", "M42Wpm-Ticket-QuickCalls", "<Table-Column Name=\"Category\" SourceName=\"Category_Value\" Type=\"guid\" />", "ResponsibleRole");
var quickCallsCategoryColumn = XmlRoot.SelectSingleNode("DataCluster[@Name='M42Tickets']/Table[@Name='M42Wpm-Ticket-QuickCalls']/Table-Columns/Table-Column[@Name='Category']") as XmlElement;
if (quickCallsCategoryColumn != null)
{
if (!string.Equals(quickCallsCategoryColumn.GetAttribute("SourceName"), "Category_Value", StringComparison.OrdinalIgnoreCase))
{
quickCallsCategoryColumn.SetAttribute("SourceName", "Category_Value");
RetVal = true;
}
if (!string.Equals(quickCallsCategoryColumn.GetAttribute("Type"), "guid", StringComparison.OrdinalIgnoreCase))
{
quickCallsCategoryColumn.SetAttribute("Type", "guid");
RetVal = true;
}
}
var quickCallsTemplate = XmlRoot.SelectSingleNode("DataCluster[@Name='M42Tickets']/Table[@Name='M42Wpm-Ticket-QuickCalls']/Matrix42-DataQueryItems-Template") as XmlElement;
if (quickCallsTemplate != null)
{
if (!string.Equals(quickCallsTemplate.GetAttribute("DataQueryName"), "C4IT - F4SD - Quick Calls", StringComparison.OrdinalIgnoreCase))
{
quickCallsTemplate.SetAttribute("DataQueryName", "C4IT - F4SD - Quick Calls");
RetVal = true;
}
}
var categoriesColumns = XmlRoot.SelectSingleNode("DataCluster[@Name='M42Tickets']/Table[@Name='M42Wpm-Ticket-Categories']/Table-Columns") as XmlElement;
if (categoriesColumns != null)
{
RetVal |= DoXmlInsertTableRow(XmlRoot, "M42Tickets", "M42Wpm-Ticket-Categories", "<Table-Column Name=\"parentValue\" SourceName=\"Parent_Value\" Type=\"guid\" />", "Name");
RetVal |= DoXmlInsertTableRow(XmlRoot, "M42Tickets", "M42Wpm-Ticket-Categories", "<Table-Column Name=\"parent\" SourceName=\"Parent\" Type=\"string\" Cardinal=\"300\" />", "parentValue");
var parentValueColumn = categoriesColumns.SelectSingleNode("Table-Column[@Name='parentValue']") as XmlElement;
if (parentValueColumn != null)
{
if (!string.Equals(parentValueColumn.GetAttribute("SourceName"), "Parent_Value", StringComparison.OrdinalIgnoreCase))
{
parentValueColumn.SetAttribute("SourceName", "Parent_Value");
RetVal = true;
}
if (!string.Equals(parentValueColumn.GetAttribute("Type"), "guid", StringComparison.OrdinalIgnoreCase))
{
parentValueColumn.SetAttribute("Type", "guid");
RetVal = true;
}
}
var parentColumn = categoriesColumns.SelectSingleNode("Table-Column[@Name='parent']") as XmlElement;
if (parentColumn != null)
{
if (!string.Equals(parentColumn.GetAttribute("SourceName"), "Parent", StringComparison.OrdinalIgnoreCase))
{
parentColumn.SetAttribute("SourceName", "Parent");
RetVal = true;
}
if (!string.Equals(parentColumn.GetAttribute("Type"), "string", StringComparison.OrdinalIgnoreCase))
{
parentColumn.SetAttribute("Type", "string");
RetVal = true;
}
if (!string.Equals(parentColumn.GetAttribute("Cardinal"), "300", StringComparison.OrdinalIgnoreCase))
{
parentColumn.SetAttribute("Cardinal", "300");
RetVal = true;
}
}
}
var categoriesTemplate = XmlRoot.SelectSingleNode("DataCluster[@Name='M42Tickets']/Table[@Name='M42Wpm-Ticket-Categories']/Matrix42-DataQueryItems-Template") as XmlElement;
if (categoriesTemplate != null)
{
var whereExpression = categoriesTemplate.GetAttribute("WhereExpression");
var normalizedWhereExpression = Regex.Replace(whereExpression ?? string.Empty, @"\s+", string.Empty);
if (string.IsNullOrWhiteSpace(whereExpression)
|| string.Equals(normalizedWhereExpression, "Hidden=false", StringComparison.OrdinalIgnoreCase))
{
categoriesTemplate.SetAttribute("WhereExpression", "Hidden = 0");
RetVal = true;
}
}
// correct the type attribute for the M42Wpm-Ticket-History table to Events
var M42JournalItemNode = XmlRoot.SelectSingleNode("DataCluster[@Name='M42Tickets']/Table[@Name='M42Wpm-Ticket-History' and @Type!='HistoryEvents']") as XmlElement;
@@ -2517,13 +2540,13 @@ namespace C4IT.DataHistoryProvider
}
public class cDataHistoryConfigQueryTemplateM42DataQueryItems : cDataHistoryConfigQueryTemplate
{
public string EntityClassName { get; private set; } = null;
public List<string> EntityTypeNames { get; private set; } = null;
public string OrderBy { get; private set; } = null;
public string WhereExpression { get; private set; } = null;
public string DataQueryName { get; private set; } = null;
public class cDataHistoryConfigQueryTemplateM42DataQueryItems : cDataHistoryConfigQueryTemplate
{
public string EntityClassName { get; private set; } = null;
public List<string> EntityTypeNames { get; private set; } = null;
public string OrderBy { get; private set; } = null;
public string WhereExpression { get; private set; } = null;
public string DataQueryName { get; private set; } = null;
internal cDataHistoryConfigQueryTemplateM42DataQueryItems(XmlElement XNode, cXmlParser Parser) :
@@ -2555,11 +2578,11 @@ namespace C4IT.DataHistoryProvider
EntityTypeNames.Add(_e2);
}
OrderBy = cXmlParser.GetStringFromXmlAttribute(XNode2, "OrderBy");
WhereExpression = cXmlParser.GetStringFromXmlAttribute(XNode2, "WhereExpression");
DataQueryName = cXmlParser.GetStringFromXmlAttribute(XNode2, "DataQueryName");
Parser.LeaveElement("Matrix42-DataQueryItems-Template");
OrderBy = cXmlParser.GetStringFromXmlAttribute(XNode2, "OrderBy");
WhereExpression = cXmlParser.GetStringFromXmlAttribute(XNode2, "WhereExpression");
DataQueryName = cXmlParser.GetStringFromXmlAttribute(XNode2, "DataQueryName");
Parser.LeaveElement("Matrix42-DataQueryItems-Template");
IsValid = true;
}

View File

@@ -58,292 +58,355 @@ namespace C4IT.DataHistoryProvider
}
private cConfigHelperParameterList LoadParameters (XmlElement XRoot, cXmlParser Parser)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
var _result = new cConfigHelperParameterList();
try
{
var Items = XRoot.ChildNodes;
foreach (var _node in Items)
{
if (!(_node is XmlElement _item)) continue;
Parser.EnterElement(_item.Name);
try
{
var _attPolicy = _item.GetAttribute("Policy");
var _attValue = _item.GetAttribute("Value");
var _ElementCount = 0;
foreach (XmlNode _subNode in _item.ChildNodes)
{
if (_subNode is XmlElement)
_ElementCount++;
}
// check for special parameters
switch (_item.Name)
{
case "InformationClassSearchPriority":
var _val = getInformationClassSearchPriority(_item, Parser);
if (_val != null)
_result.Items[_val.Name] = _val;
continue;
case "OpenActivitiesExternally":
var _openActivitiesEntry = getOpenActivitiesExternallyEntry(_item);
if (_openActivitiesEntry != null)
_result.Items[_openActivitiesEntry.Name] = _openActivitiesEntry;
var _overrideValues = getOpenActivitiesExternallyOverrides(_item, Parser);
if (_overrideValues != null && _overrideValues.ValueList != null && _overrideValues.ValueList.Count > 0)
_result.Items[_overrideValues.Name] = _overrideValues;
continue;
}
if (_attPolicy != null && _attValue != null && _ElementCount == 0)
{
// we have a simple parameter
var _policy = cXmlParser.GetEnumFromAttribute<enumConfigPolicy>(_item, "Policy", enumConfigPolicy.Default);
var _value = cXmlParser.GetStringFromXmlAttribute(_item, "Value", String.Empty);
_result.Items[_item.Name] = new cConfigHelperParameterEntry()
{
Name = _item.Name,
Value = _value,
Policy = _policy.ToString(),
};
}
else if (string.IsNullOrEmpty(_attPolicy) && string.IsNullOrEmpty(_attValue) && _ElementCount > 0)
{
// we have a sublist
if (_result.SubItems == null)
_result.SubItems = new Dictionary<string, cConfigHelperParameterList>();
_result.SubItems[_item.Name] = LoadParameters(_item, Parser);
}
else
{
// we have an invalid entry
var _msg = $"Invalid entry in F4SD-Global-Configuration.xml: {_item.Name}";
Parser.AddMessage(_item, _msg, LogLevels.Warning);
LogEntry(_msg, LogLevels.Warning);
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
Parser.LeaveElement(_item.Name);
}
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
return _result;
}
private cConfigHelperParameterEntry getInformationClassSearchPriority(XmlElement XNode, cXmlParser Parser)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
var _xNodes = XNode.ChildNodes;
var _policy = cXmlParser.GetEnumFromAttribute<enumConfigPolicy>(XNode, "Policy", enumConfigPolicy.Default);
var _result = new List<string>();
foreach (var _xNode in _xNodes)
{
if (!(_xNode is XmlElement _item))
continue;
Parser.EnterElement(_item.Name);
try
{
if (_item.Name != "InformationClass")
{
// we have an invalid entry
var _msg = $"Invalid entry in F4SD-Global-Configuration.xml: {_item.Name}, should be <InformationClass/>";
Parser.AddMessage(_item, _msg, LogLevels.Warning);
LogEntry(_msg, LogLevels.Warning);
continue;
}
var _InfoClass = cXmlParser.GetEnumFromAttribute<enumFasdInformationClass>(_item, "Type", enumFasdInformationClass.Unknown);
if (_InfoClass == enumFasdInformationClass.Unknown)
{
// we have an invalid type attribute
var _strType = cXmlParser.GetStringFromXmlAttribute(_item, "Type", String.Empty);
var _msg = $"Invalid type attribute value ({_strType}) in entry {_item.Name}";
Parser.AddMessage(_item, _msg, LogLevels.Warning);
LogEntry(_msg, LogLevels.Warning);
continue;
}
var _strInfoClass = _InfoClass.ToString();
if (!_result.Contains(_strInfoClass))
_result.Add(_strInfoClass);
}
catch (Exception E)
{
LogException(E);
}
finally
{
Parser.LeaveElement(_item.Name);
}
}
return new cConfigHelperParameterEntry()
{
Name = XNode.Name,
ValueList = _result,
Policy = _policy.ToString()
};
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
return null;
}
private static cConfigHelperParameterEntry getOpenActivitiesExternallyEntry(XmlElement XNode)
{
var _policy = cXmlParser.GetEnumFromAttribute<enumConfigPolicy>(XNode, "Policy", enumConfigPolicy.Default);
var _value = cXmlParser.GetStringFromXmlAttribute(XNode, "Value", String.Empty);
if (string.IsNullOrWhiteSpace(_value))
return null;
return new cConfigHelperParameterEntry()
{
Name = "OpenActivitiesExternally",
Value = _value,
Policy = _policy.ToString(),
};
}
private cConfigHelperParameterEntry getOpenActivitiesExternallyOverrides(XmlElement XNode, cXmlParser Parser)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
var _xNodes = XNode.ChildNodes;
var _policy = cXmlParser.GetEnumFromAttribute<enumConfigPolicy>(XNode, "Policy", enumConfigPolicy.Default);
var _result = new List<string>();
foreach (var _xNode in _xNodes)
{
if (!(_xNode is XmlElement _item))
continue;
Parser.EnterElement(_item.Name);
try
{
if (_item.Name != "OpenActivityOverride")
{
var _msg = $"Invalid entry in F4SD-Global-Configuration.xml: {_item.Name}, should be <OpenActivityOverride/>";
Parser.AddMessage(_item, _msg, LogLevels.Warning);
LogEntry(_msg, LogLevels.Warning);
continue;
}
var activityType = cXmlParser.GetStringFromXmlAttribute(_item, "ActivityType", String.Empty)?.Trim();
if (string.IsNullOrWhiteSpace(activityType))
{
var _msg = $"Missing ActivityType attribute value in entry {_item.Name}";
Parser.AddMessage(_item, _msg, LogLevels.Warning);
LogEntry(_msg, LogLevels.Warning);
continue;
}
var valueText = cXmlParser.GetStringFromXmlAttribute(_item, "Value", String.Empty)?.Trim();
if (string.IsNullOrWhiteSpace(valueText))
{
var _msg = $"Missing Value attribute value in entry {_item.Name} ({activityType})";
Parser.AddMessage(_item, _msg, LogLevels.Warning);
LogEntry(_msg, LogLevels.Warning);
continue;
}
var normalizedValue = valueText.ToLowerInvariant();
bool? parsedValue = null;
switch (normalizedValue)
{
case "true":
case "1":
case "yes":
parsedValue = true;
break;
case "false":
case "0":
case "no":
parsedValue = false;
break;
}
if (!parsedValue.HasValue)
{
var _msg = $"Invalid Value attribute value ({valueText}) in entry {_item.Name} ({activityType})";
Parser.AddMessage(_item, _msg, LogLevels.Warning);
LogEntry(_msg, LogLevels.Warning);
continue;
}
_result.Add($"{activityType}={(parsedValue.Value ? "true" : "false")}");
}
catch (Exception E)
{
LogException(E);
}
finally
{
Parser.LeaveElement(_item.Name);
}
}
return new cConfigHelperParameterEntry()
{
Name = "OpenActivitiesExternallyOverrides",
ValueList = _result,
Policy = _policy.ToString()
};
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
return null;
}
private cConfigHelperParameterList LoadParameters (XmlElement XRoot, cXmlParser Parser)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
var _result = new cConfigHelperParameterList();
try
{
var Items = XRoot.ChildNodes;
foreach (var _node in Items)
{
if (!(_node is XmlElement _item)) continue;
Parser.EnterElement(_item.Name);
try
{
var _attPolicy = _item.GetAttribute("Policy");
var _attValue = _item.GetAttribute("Value");
var _ElementCount = 0;
foreach (XmlNode _subNode in _item.ChildNodes)
{
if (_subNode is XmlElement)
_ElementCount++;
}
// check for special parameters
switch (_item.Name)
{
case "InformationClassSearchPriority":
var _val = getInformationClassSearchPriority(_item, Parser);
if (_val != null)
_result.Items[_val.Name] = _val;
continue;
case "OpenActivitiesExternally":
var _openActivitiesEntry = getOpenActivitiesExternallyEntry(_item);
if (_openActivitiesEntry != null)
_result.Items[_openActivitiesEntry.Name] = _openActivitiesEntry;
var _overrideValues = getOpenActivitiesExternallyOverrides(_item, Parser);
if (_overrideValues != null && _overrideValues.ValueList != null && _overrideValues.ValueList.Count > 0)
_result.Items[_overrideValues.Name] = _overrideValues;
continue;
case "TicketProcessing":
var _ticketProcessingEntry = getTicketProcessingEntry(_item, Parser);
if (_ticketProcessingEntry != null)
_result.Items[_ticketProcessingEntry.Name] = _ticketProcessingEntry;
continue;
}
if (_attPolicy != null && _attValue != null && _ElementCount == 0)
{
// we have a simple parameter
var _policy = cXmlParser.GetEnumFromAttribute<enumConfigPolicy>(_item, "Policy", enumConfigPolicy.Default);
var _value = cXmlParser.GetStringFromXmlAttribute(_item, "Value", String.Empty);
_result.Items[_item.Name] = new cConfigHelperParameterEntry()
{
Name = _item.Name,
Value = _value,
Policy = _policy.ToString(),
};
}
else if (string.IsNullOrEmpty(_attPolicy) && string.IsNullOrEmpty(_attValue) && _ElementCount > 0)
{
// we have a sublist
if (_result.SubItems == null)
_result.SubItems = new Dictionary<string, cConfigHelperParameterList>();
_result.SubItems[_item.Name] = LoadParameters(_item, Parser);
}
else
{
// we have an invalid entry
var _msg = $"Invalid entry in F4SD-Global-Configuration.xml: {_item.Name}";
Parser.AddMessage(_item, _msg, LogLevels.Warning);
LogEntry(_msg, LogLevels.Warning);
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
Parser.LeaveElement(_item.Name);
}
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
return _result;
}
private cConfigHelperParameterEntry getInformationClassSearchPriority(XmlElement XNode, cXmlParser Parser)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
var _xNodes = XNode.ChildNodes;
var _policy = cXmlParser.GetEnumFromAttribute<enumConfigPolicy>(XNode, "Policy", enumConfigPolicy.Default);
var _result = new List<string>();
foreach (var _xNode in _xNodes)
{
if (!(_xNode is XmlElement _item))
continue;
Parser.EnterElement(_item.Name);
try
{
if (_item.Name != "InformationClass")
{
// we have an invalid entry
var _msg = $"Invalid entry in F4SD-Global-Configuration.xml: {_item.Name}, should be <InformationClass/>";
Parser.AddMessage(_item, _msg, LogLevels.Warning);
LogEntry(_msg, LogLevels.Warning);
continue;
}
var _InfoClass = cXmlParser.GetEnumFromAttribute<enumFasdInformationClass>(_item, "Type", enumFasdInformationClass.Unknown);
if (_InfoClass == enumFasdInformationClass.Unknown)
{
// we have an invalid type attribute
var _strType = cXmlParser.GetStringFromXmlAttribute(_item, "Type", String.Empty);
var _msg = $"Invalid type attribute value ({_strType}) in entry {_item.Name}";
Parser.AddMessage(_item, _msg, LogLevels.Warning);
LogEntry(_msg, LogLevels.Warning);
continue;
}
var _strInfoClass = _InfoClass.ToString();
if (!_result.Contains(_strInfoClass))
_result.Add(_strInfoClass);
}
catch (Exception E)
{
LogException(E);
}
finally
{
Parser.LeaveElement(_item.Name);
}
}
return new cConfigHelperParameterEntry()
{
Name = XNode.Name,
ValueList = _result,
Policy = _policy.ToString()
};
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
return null;
}
private static cConfigHelperParameterEntry getTicketProcessingEntry(XmlElement XNode, cXmlParser Parser)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
var _xNodes = XNode.SelectNodes("TicketTypeProcessing");
var _policy = cXmlParser.GetEnumFromAttribute<enumConfigPolicy>(XNode, "Policy", enumConfigPolicy.Default);
var _value = cXmlParser.GetEnumFromAttribute<enumTicketProcessing>(XNode, "Value", enumTicketProcessing.Both);
var _result = new List<string>();
foreach (var _xNode in _xNodes)
{
if (!(_xNode is XmlElement _item))
continue;
Parser.EnterElement(_item.Name);
try
{
var _ticketType = cXmlParser.GetEnumFromAttribute<enumTicketType>(_item, "Type", enumTicketType.Ticket);
var _processingValue = cXmlParser.GetEnumFromAttribute<enumTicketProcessing>(_item, "Value", enumTicketProcessing.Both);
_result.Add(_ticketType.ToString() + "=" + _processingValue.ToString());
}
catch (Exception E)
{
LogException(E);
}
finally
{
Parser.LeaveElement(_item.Name);
}
}
var _retVal = new cConfigHelperParameterEntry()
{
Name = XNode.Name,
ValueList = _result,
Policy = _policy.ToString()
};
return _retVal;
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
return null;
}
private static cConfigHelperParameterEntry getOpenActivitiesExternallyEntry(XmlElement XNode)
{
var _policy = cXmlParser.GetEnumFromAttribute<enumConfigPolicy>(XNode, "Policy", enumConfigPolicy.Default);
var _value = cXmlParser.GetStringFromXmlAttribute(XNode, "Value", String.Empty);
if (string.IsNullOrWhiteSpace(_value))
return null;
return new cConfigHelperParameterEntry()
{
Name = "OpenActivitiesExternally",
Value = _value,
Policy = _policy.ToString(),
};
}
private cConfigHelperParameterEntry getOpenActivitiesExternallyOverrides(XmlElement XNode, cXmlParser Parser)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
var _xNodes = XNode.ChildNodes;
var _policy = cXmlParser.GetEnumFromAttribute<enumConfigPolicy>(XNode, "Policy", enumConfigPolicy.Default);
var _result = new List<string>();
foreach (var _xNode in _xNodes)
{
if (!(_xNode is XmlElement _item))
continue;
Parser.EnterElement(_item.Name);
try
{
if (_item.Name != "OpenActivityOverride")
{
var _msg = $"Invalid entry in F4SD-Global-Configuration.xml: {_item.Name}, should be <OpenActivityOverride/>";
Parser.AddMessage(_item, _msg, LogLevels.Warning);
LogEntry(_msg, LogLevels.Warning);
continue;
}
var activityType = cXmlParser.GetStringFromXmlAttribute(_item, "ActivityType", String.Empty)?.Trim();
if (string.IsNullOrWhiteSpace(activityType))
{
var _msg = $"Missing ActivityType attribute value in entry {_item.Name}";
Parser.AddMessage(_item, _msg, LogLevels.Warning);
LogEntry(_msg, LogLevels.Warning);
continue;
}
var valueText = cXmlParser.GetStringFromXmlAttribute(_item, "Value", String.Empty)?.Trim();
if (string.IsNullOrWhiteSpace(valueText))
{
var _msg = $"Missing Value attribute value in entry {_item.Name} ({activityType})";
Parser.AddMessage(_item, _msg, LogLevels.Warning);
LogEntry(_msg, LogLevels.Warning);
continue;
}
var normalizedValue = valueText.ToLowerInvariant();
bool? parsedValue = null;
switch (normalizedValue)
{
case "true":
case "1":
case "yes":
parsedValue = true;
break;
case "false":
case "0":
case "no":
parsedValue = false;
break;
}
if (!parsedValue.HasValue)
{
var _msg = $"Invalid Value attribute value ({valueText}) in entry {_item.Name} ({activityType})";
Parser.AddMessage(_item, _msg, LogLevels.Warning);
LogEntry(_msg, LogLevels.Warning);
continue;
}
_result.Add($"{activityType}={(parsedValue.Value ? "true" : "false")}");
}
catch (Exception E)
{
LogException(E);
}
finally
{
Parser.LeaveElement(_item.Name);
}
}
return new cConfigHelperParameterEntry()
{
Name = "OpenActivitiesExternallyOverrides",
ValueList = _result,
Policy = _policy.ToString()
};
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
return null;
}
public override bool DoXmlUpdates(XmlElement XmlRoot, bool withM42Config = false, bool withIntuneConfig = false, bool withMobileDeviceConfig = false, bool withCitrixConfig = false)
{
@@ -409,31 +472,31 @@ namespace C4IT.DataHistoryProvider
, "NotesMandatory"
, "<NotesMandatory Policy=\"Hidden\" Value=\"false\" />"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration"
, "ShowOverview"
, "<ShowOverview Policy=\"Hidden\" Value=\"true\" />"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration"
, "OpenActivitiesExternally"
, "<OpenActivitiesExternally Policy=\"Hidden\" Value=\"false\" />"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration/OpenActivitiesExternally"
, "OpenActivityOverride[@ActivityType='SPSActivityTypeTicket']"
, "<OpenActivityOverride ActivityType=\"SPSActivityTypeTicket\" Value=\"false\" />"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration/OpenActivitiesExternally"
, "OpenActivityOverride[@ActivityType='SPSActivityTypeServiceRequest']"
, "<OpenActivityOverride ActivityType=\"SPSActivityTypeServiceRequest\" Value=\"true\" />"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration"
, "OverviewPollingPersonal"
, $"<OverviewPollingPersonal Policy=\"Hidden\" Value=\"{cF4sdTicketConfig.DefaultOverviewPollingPersonal}\" />"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration"
, "ShowOverview"
, "<ShowOverview Policy=\"Hidden\" Value=\"true\" />"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration"
, "OpenActivitiesExternally"
, "<OpenActivitiesExternally Policy=\"Hidden\" Value=\"false\" />"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration/OpenActivitiesExternally"
, "OpenActivityOverride[@ActivityType='SPSActivityTypeTicket']"
, "<OpenActivityOverride ActivityType=\"SPSActivityTypeTicket\" Value=\"false\" />"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration/OpenActivitiesExternally"
, "OpenActivityOverride[@ActivityType='SPSActivityTypeServiceRequest']"
, "<OpenActivityOverride ActivityType=\"SPSActivityTypeServiceRequest\" Value=\"true\" />"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration"
, "OverviewPollingPersonal"
, $"<OverviewPollingPersonal Policy=\"Hidden\" Value=\"{cF4sdTicketConfig.DefaultOverviewPollingPersonal}\" />"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration"
, "OverviewPollingRole"
@@ -451,8 +514,30 @@ namespace C4IT.DataHistoryProvider
RetVal |= DoXmlInsertElement(XmlRoot
, "TicketConfiguration"
, "DisableAutomaticTimeTracking"
, $"<DisableAutomaticTimeTracking Policy=\"Mandatory\" Value=\"{oldDisableAutomaticTimeTracking.ToString()}\" />"
, $"<DisableAutomaticTimeTracking Policy=\"Mandatory\" Value=\"{oldDisableAutomaticTimeTracking.ToString().ToLowerInvariant()}\" />"
);
if(withIntuneConfig)
{
RetVal |= DoXmlInsertElement(XmlRoot
, ""
, "IntuneConfiguration"
, "<IntuneConfiguration />"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "IntuneConfiguration"
, "TAPLifeTimeInMinutes"
, $"<TAPLifeTimeInMinutes Policy=\"Default\" Value=\"{cF4sdIntuneConfig.DefaultTAPLifeTimeInMinutes}\" />"
);
RetVal |= DoXmlInsertElement(XmlRoot
, "IntuneConfiguration"
, "TAPIsUsableOnce"
, $"<TAPIsUsableOnce Policy=\"Default\" Value=\"{cF4sdIntuneConfig.DefaultTAPIsUsableOnce}\" />"
);
}
}
catch (Exception E)

View File

@@ -1,15 +1,15 @@
using C4IT.Configuration;
using C4IT.FASD.Base;
using C4IT.FASD.Base;
using C4IT.Logging;
using C4IT.Security;
using C4IT.XML;
using C4IT_DataHistoryProvider;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Xml;
using C4IT.DataHistoryProvider.Base.Modules.Citrix;
using static C4IT.Logging.cLogManager;
using static C4IT_DataHistoryProvider.cDataHistoryConfigCitrix;
namespace C4IT.DataHistoryProvider
{
@@ -32,13 +32,14 @@ namespace C4IT.DataHistoryProvider
public cDataHistoryConfigClientAgent ClientAgent { get; private set; } = null;
public cDataHistoryConfigM42Wpm M42Wpm { get; private set; } = null;
public cDataHistoryConfigCitrix Citrix { get; private set; } = null;
public Dictionary<string, cDataHistoryCitrixTenant> CitrixTenants { get; private set; } = null;
public cDataHistoryConfigNexthink Nexthink { get; private set; } = null;
public cDataHistoryConfigActiveDirectory ActiveDirectory { get; private set; } = null;
public Dictionary<string, cDataHistoryAzureTenant> AzureTenants { get; private set; } = null;
public Dictionary<string, cDataHistoryAzureTenant> AzureTenants { get; private set; } = null; //ToDo: create a class for the azure configuration instead of only the tenants
public cF4SDAuthorisation Authorisation { get; private set; } = null;
@@ -81,7 +82,6 @@ namespace C4IT.DataHistoryProvider
ActiveDirectory = _ad;
AzureTenants = cDataHistoryAzureTenant.LoadFromXml(XRoot, Credentials, Parser);
CitrixTenants = cDataHistoryCitrixTenant.LoadFromXml(XRoot, Credentials, Parser);
// get the client agent config
var _cla = new cDataHistoryConfigClientAgent(XRoot, Credentials, Conns, Parser);

View File

@@ -102,9 +102,12 @@ namespace C4IT.DataHistoryProvider
string name = a["QueueName"]?.Value;
string id = a["QueueID"]?.Value;
Guid guid;
Guid guid = Guid.Empty;
if (string.IsNullOrWhiteSpace(name) || !Guid.TryParse(id, out guid))
if (string.IsNullOrWhiteSpace(name))
return null;
if (!string.IsNullOrWhiteSpace(id) && !Guid.TryParse(id, out guid))
return null;
return new cApiM42TicketQueueInfo

View File

@@ -0,0 +1,16 @@
using C4IT.FASD.Base;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace C4IT.DataHistoryProvider.Base.DataSources
{
public interface IRemoteDesktopManager<TRemoteConnectionInfo, TClientInfo, TRemoteConnectionStatus>
{
Task<TRemoteConnectionInfo> InitiateConnectionOfClient(TClientInfo clientInfos, bool isElevated, CancellationToken token = default);
Task TerminateConnection(Guid connectionId);
Task<TRemoteConnectionStatus> GetConnectionStatus(Guid connectionId);
bool IsActive();
Task<HealthInformation> GetHealthInfo();
}
}

View File

@@ -1,9 +1,11 @@
using C4IT.FASD.Base;
using System;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using C4IT.DataHistoryProvider;
using C4IT.FASD.Base;
namespace C4IT_DataHistoryProvider_Base.DataSources
{
public interface ISearchResultRelationProvider
@@ -17,6 +19,6 @@ namespace C4IT_DataHistoryProvider_Base.DataSources
/// <param name="informationClass">Determines the information class the objects have, for which relations should be searched.</param>
/// <param name="ageInDays">Specifies the time, in which the relations should be considered.</param>
/// <returns></returns>
Task<cF4sdStagedSearchResultRelations> GetRelationsAsync(IEnumerable<cF4sdIdentityEntry> ids, enumFasdInformationClass informationClass, int ageInDays, CancellationToken token = default);
Task<cF4sdStagedSearchResultRelations> GetRelationsAsync(IEnumerable<cF4sdConnectorIds> ids, enumFasdInformationClass informationClass, int ageInDays, CancellationToken token = default);
}
}

View File

@@ -7,7 +7,7 @@
</PropertyGroup>
<PropertyGroup>
<OutputType>Library</OutputType>
<RootNamespace>C4IT_DataHistoryProvider_Base</RootNamespace>
<RootNamespace>C4IT.DataHistoryProvider.Base</RootNamespace>
<Configurations>Debug;Debug-Demo;Release;Release-Demo</Configurations>
<Deterministic>false</Deterministic>
</PropertyGroup>
@@ -50,6 +50,7 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="..\..\C4IT FASD\_Common\C4IT.F4SD.Base.Ticket.cs" Link="Common\C4IT.F4SD.Base.Ticket.cs" />
<Compile Include="..\..\C4IT FASD\_Common\C4IT.F4SD.GlobalConfig.cs">
<Link>Common\C4IT.F4SD.GlobalConfig.cs</Link>
</Compile>

View File

@@ -0,0 +1,95 @@
using C4IT.DataHistoryProvider.Base.Modules.Agent.DTOs;
using C4IT.FASD.Base;
using C4IT.FASD.Communication.Agent;
using C4IT.HTTP;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using static C4IT.Logging.cLogManager;
namespace C4IT.DataHistoryProvider.Base.Modules.Agent
{
internal class AgentApiHandler : cHttpApiBase
{
private readonly Uri _baseUrl;
private const string _agentLoginPath = "connect/token";
private readonly cAgentApiConfiguration _agentConfig;
public AgentApiHandler(cAgentApiConfiguration agentConfig) : base("Agent ID tenant", $"{agentConfig.ApiUrl}/{agentConfig.LogonUrl}")
{
_agentConfig = agentConfig;
_baseUrl = new Uri(_agentConfig.LogonUrl);
AlwaysReturnContent = true;
}
private protected override async Task<bool> privLogonAsync(cOAuthLogonInfo logonInfo)
{
try
{
var postData = new List<KeyValuePair<string, string>>()
{
new KeyValuePair<string, string>("grant_type", "client_credentials"),
new KeyValuePair<string, string>("client_id", logonInfo.ClientID),
new KeyValuePair<string, string>("client_secret", logonInfo.ClientSecret)
};
var formData = new FormUrlEncodedContent(postData);
var request = new HttpRequestMessage(HttpMethod.Post, new Uri(_baseUrl, _agentLoginPath)) { Content = formData };
using (var httpClient = new HttpClient())
{
var response = await httpClient.SendAsync(request);
if (response.StatusCode != HttpStatusCode.OK)
{
var responseMessage = await response.Content.ReadAsStreamAsync();
LogEntry($"F4SD Agent Logon failed. StatusCode: {response.StatusCode}");
LogEntry($"F4SD Agent Logon failed. Response: {responseMessage}");
return false;
}
string responseContent = await response.Content.ReadAsStringAsync();
var logonResult = JsonConvert.DeserializeObject<cAgentApiLogonInfo>(responseContent);
if (logonResult.TokenType.Equals("Bearer", StringComparison.OrdinalIgnoreCase) == false)
{
LogEntry("F4SD Agent Access token is not of type 'Bearer'.");
return false;
}
cAgentApiLogonInfo.Instance = logonResult;
AccessToken = logonResult.AccessToken;
TokenExpiresIn = DateTime.UtcNow + TimeSpan.FromSeconds(logonResult.SecondsTillTokenExpires * RelogonFactor);
IsOnline = true;
}
return true;
}
catch (Exception ex)
{
LogException(ex);
return false;
}
}
internal async Task<T> Request<T>(string url, eHttpMethod httpMethod = eHttpMethod.get, object bodyData = null, CancellationToken token = default) where T : AgentApiResult
{
await LogonAsync(new cOAuthLogonInfo() { ClientID = _agentConfig.ClientId, ClientSecret = _agentConfig.ClientSecret, Tenant = "F4SD Agent" });
Uri agentUrl = new Uri(_baseUrl, url);
dynamic requestResult = await privRequestAsync(agentUrl.ToString(), httpMethod, bodyData, token: token);
// todo handle not successfull status
requestResult.ToObject<T>();
string serialized = JsonConvert.SerializeObject(requestResult); // todo find better approach for casting the dynamic
T deserialized = JsonConvert.DeserializeObject<T>(serialized);
return deserialized;
}
internal async Task Request(string url, eHttpMethod httpMethod = eHttpMethod.get, object bodyData = null)
=> await privRequestAsync(url, httpMethod, bodyData);
}
}

View File

@@ -0,0 +1,16 @@
using Newtonsoft.Json;
namespace C4IT.DataHistoryProvider.Base.Modules.Agent
{
public class AgentRemoteClientInfo
{
[JsonProperty("orgCode")]
public int OrganisationCode { get; set; }
[JsonProperty("deviceCode")]
public int DeviceCode { get; set; }
[JsonProperty("accountCode")]
public int AccountCode { get; set; }
}
}

View File

@@ -0,0 +1,18 @@
using C4IT.FASD.Communication.Agent;
using Newtonsoft.Json;
using System;
namespace C4IT.DataHistoryProvider.Base.Modules.Agent
{
public class AgentRemoteConnectionInfo : AgentApiResult
{
[JsonProperty("connectionId")]
public Guid ConnectionId { get; set; }
[JsonProperty("phoenixServiceUrl")]
public Uri ServiceUrl { get; set; }
[JsonProperty("secret")]
public string Secret { get; set; }
}
}

View File

@@ -0,0 +1,46 @@
using C4IT.DataHistoryProvider.Base.DataSources;
using C4IT.FASD.Base;
using C4IT.FASD.Communication.Agent;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace C4IT.DataHistoryProvider.Base.Modules.Agent
{
public class AgentRemoteDesktopManager : IRemoteDesktopManager<AgentRemoteConnectionInfo, AgentRemoteClientInfo, AgentRemoteConnectionStatusDto>
{
private readonly AgentApiHandler _agentApiHandler;
public AgentRemoteDesktopManager(cAgentApiConfiguration agentConfig)
{
_agentApiHandler = new AgentApiHandler(agentConfig);
}
public async Task<AgentRemoteConnectionStatusDto> GetConnectionStatus(Guid connectionId)
{
return await _agentApiHandler.Request<AgentRemoteConnectionStatusDto>($"api/management/c4it/phoenix-connections/{connectionId}/status", HTTP.eHttpMethod.get);
}
public async Task<AgentRemoteConnectionInfo> InitiateConnectionOfClient(AgentRemoteClientInfo clientInfos, bool isElevated, CancellationToken token)
{
string url = "api/management/c4it/phoenix-connections";
if (isElevated)
url += "/admin";
return await _agentApiHandler.Request<AgentRemoteConnectionInfo>(url, HTTP.eHttpMethod.post, clientInfos, token);
}
public async Task TerminateConnection(Guid connectionId)
{
await _agentApiHandler.Request($"api/management/c4it/phoenix-connections/{connectionId}", HTTP.eHttpMethod.delete);
}
public bool IsActive() => true;
public Task<HealthInformation> GetHealthInfo()
{
// todo Agent Server has to implement an "health" endpoint and return its result
return Task.FromResult(new HealthInformation(HealthStatus.healthy));
}
}
}

View File

@@ -0,0 +1,13 @@
using Newtonsoft.Json;
namespace C4IT.DataHistoryProvider.Base.Modules.Agent.DTOs
{
public class AgentErrorDto
{
[JsonProperty("code")]
public string Code { get; set; }
[JsonProperty("message")]
public string Message { get; set; }
}
}

View File

@@ -0,0 +1,22 @@
using Newtonsoft.Json;
namespace C4IT.DataHistoryProvider.Base.Modules.Agent.DTOs
{
public class AgentLogonResultDto
{
[JsonProperty("access_token")]
public string AccessToken { get; set; }
[JsonProperty("expires_in")]
public int ExpiresIn { get; set; }
[JsonProperty("token_type")]
public string TokenType { get; set; }
[JsonProperty("scope")]
public string Scope { get; set; }
[JsonProperty("remote_ip")]
public string RemoteIp { get; set; }
}
}

View File

@@ -0,0 +1,295 @@
using System;
using System.Collections.Generic;
using System.DirectoryServices.ActiveDirectory;
using System.Net;
using System.Reflection;
using System.Xml;
using C4IT.DataHistoryProvider;
using C4IT.Logging;
using C4IT.Security;
using C4IT.XML;
using static C4IT.Logging.cLogManager;
namespace C4IT.DataHistoryProvider.Base.Modules.Citrix
{
public class cDataHistoryConfigCitrix : IConfigNodeValidation
{
public bool IsValid { get; private set; } = false;
public cDataHistoryScanTiming ScanTiming { get; private set; } = null;
public cDataHistoryConfigCitrix(XmlElement XNode, Dictionary<string, cCredential> Credentials, cXmlParser Parser)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
var XNode2 = XNode.SelectSingleNode("Citrix");
if (!(XNode2 is XmlElement XCitrix))
{
return;
}
Parser.EnterElement("Citrix");
try
{
ScanTiming = new cDataHistoryScanTiming(XCitrix, TimeSpan.FromHours(24), TimeSpan.FromMinutes(10), Parser);
Systems = cDataHistoryCitrixCloudTenant.LoadFromXml(XCitrix, Credentials, Parser);
if (Systems == null)
Systems = new List<cDataHistoryCitrixSystem>();
var _onPremSystems = cDataHistoryCitrixOnPrem.LoadFromXml(XCitrix, Credentials, Parser);
if (_onPremSystems != null)
Systems.AddRange(_onPremSystems);
IsValid = true;
}
finally
{
Parser.LeaveElement("Citrix");
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
}
public List<cDataHistoryCitrixSystem> Systems { get; private set; } = null; //ToDo: Check all uses of the citrix systems to implement on prem and tenant specific handling if needed
}
public abstract class cDataHistoryCitrixSystem : cConfigNodeNamed
{
public cCredential Credential { get; private set; } = null;
public Guid SiteID { get; set; } = Guid.Empty;
public cDataHistoryCitrixSystem(XmlElement XNode, Dictionary<string, cCredential> Credentials, cXmlParser Parser) : base(XNode, Parser)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
if (!IsValid)
return;
SiteID = cXmlParser.GetGuidFromXmlAttribute(XNode, "SiteID");
var strCreds = cXmlParser.GetStringFromXmlAttribute(XNode, "Credential");
if (!string.IsNullOrWhiteSpace(strCreds))
{
if (Credentials.TryGetValue(strCreds, out var Cred))
Credential = Cred;
}
if (Credential == null)
{
Parser.AddInvalidAttribute(XNode, null, "Credential");
return;
}
IsValid = true;
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
}
}
public class cDataHistoryCitrixCloudTenant : cDataHistoryCitrixSystem
{
public string Domain { get; private set; } = "";
public string TenantID { get; private set; } = String.Empty;
internal cDataHistoryCitrixCloudTenant(XmlElement XNode, Dictionary<string, cCredential> Credentials, cXmlParser Parser) : base(XNode, Credentials, Parser)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
if (!IsValid)
return;
Domain = cXmlParser.GetStringFromXmlAttribute(XNode, "Domain");
if (string.IsNullOrWhiteSpace(Domain))
{
Parser.AddInvalidAttribute(XNode, null, "Domain");
return;
}
TenantID = cXmlParser.GetStringFromXmlAttribute(XNode, "TenantID");
if (TenantID == String.Empty)
{
Parser.AddInvalidAttribute(XNode, Domain, "TenantID");
return;
}
IsValid = true;
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
}
internal static List<cDataHistoryCitrixSystem> LoadFromXml(XmlElement XNode, Dictionary<string, cCredential> Credentials, cXmlParser Parser)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
var RetVal = new List<cDataHistoryCitrixSystem>();
try
{
var XList = XNode.SelectNodes("Citrix-Cloud-Tenant");
if (XList != null && XList.Count > 0)
{
Parser.EnterElement("Citrix-Cloud-Tenant");
try
{
foreach (var Entry in XList)
{
if (!(Entry is XmlElement XEntry))
continue;
var Node = new cDataHistoryCitrixCloudTenant(XEntry, Credentials, Parser);
if (Node.IsValid)
RetVal.Add(Node);
Parser.SelectElementNext();
}
}
finally
{
Parser.LeaveElement("Citrix-Cloud-Tenant");
}
}
XList = XNode.SelectNodes("Citrix-OnPrem-System");
if (XList != null && XList.Count > 0)
{
Parser.EnterElement("Citrix-OnPrem-System");
try
{
foreach (var Entry in XList)
{
if (!(Entry is XmlElement XEntry))
continue;
var Node = new cDataHistoryCitrixOnPrem(XEntry, Credentials, Parser);
if (Node.IsValid)
RetVal.Add(Node);
Parser.SelectElementNext();
}
}
finally
{
Parser.LeaveElement("Citrix-OnPrem-System");
}
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
return RetVal;
}
}
public class cDataHistoryCitrixOnPrem : cDataHistoryCitrixSystem
{
public string Server { get; private set; } = string.Empty;
internal cDataHistoryCitrixOnPrem(XmlElement XNode, Dictionary<string, cCredential> Credentials, cXmlParser Parser) : base(XNode, Credentials, Parser)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
Server = cXmlParser.GetStringFromXmlAttribute(XNode, "Server");
if (string.IsNullOrWhiteSpace(Server))
{
Parser.AddInvalidAttribute(XNode, null, "Server");
return;
}
IsValid = true;
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
}
internal static List<cDataHistoryCitrixSystem> LoadFromXml(XmlElement XNode, Dictionary<string, cCredential> Credentials, cXmlParser Parser)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
var RetVal = new List<cDataHistoryCitrixSystem>();
try
{
var XList = XNode.SelectNodes("Citrix-OnPrem");
if (XList != null && XList.Count > 0)
{
Parser.EnterElement("Citrix-OnPrem");
try
{
foreach (var Entry in XList)
{
if (!(Entry is XmlElement XEntry))
continue;
var Node = new cDataHistoryCitrixOnPrem(XEntry, Credentials, Parser);
if (Node.IsValid)
RetVal.Add(Node);
Parser.SelectElementNext();
}
}
finally
{
Parser.LeaveElement("Citrix-OnPrem");
}
}
}
catch (Exception E)
{
LogException(E);
}
finally
{
if (CM != null) LogMethodEnd(CM);
}
return RetVal;
}
}
}

View File

@@ -11,7 +11,7 @@ namespace C4IT_DataHistoryProvider_Base.Services
/// <summary>
/// Triggers search for relations to given information objects.
/// </summary>
cF4sdStagedSearchResultRelationTaskId StartGatheringRelatedObjects(IEnumerable<cFasdApiSearchResultEntry> relatedTo, int ageInDays);
Task<cF4sdStagedSearchResultRelationTaskId> StartGatheringRelatedObjects(IEnumerable<cFasdApiSearchResultEntry> relatedTo, int ageInDays);
/// <summary>
/// Used after triggering search for related objects in <see cref="StartGatheringRelatedObjects"/> to retrieve the already found relations.

View File

@@ -1,4 +1,5 @@
using C4IT.FASD.Base;
using C4IT.DataHistoryProvider;
using C4IT.FASD.Base;
using C4IT.Logging;
using C4IT_DataHistoryProvider_Base.DataSources;
using System;
@@ -16,13 +17,16 @@ namespace C4IT_DataHistoryProvider_Base.Services
private static readonly Dictionary<Guid, GatherRelatedObjectTask> _relationTasks = new Dictionary<Guid, GatherRelatedObjectTask>();
private readonly IEnumerable<ISearchResultRelationProvider> _providers;
private readonly cDataHistoryCollector _collector;
private static readonly System.Timers.Timer _relationTaskCleanupTimer = new System.Timers.Timer(CleanupInterval);
private const int CleanupInterval = 5 * 60 * 1000;
private readonly TimeSpan RelationTaskExpiration = TimeSpan.FromMinutes(15);
public StagedRelationService(IEnumerable<ISearchResultRelationProvider> providers)
public StagedRelationService(cDataHistoryCollector collector, IEnumerable<ISearchResultRelationProvider> providers)
{
_providers = providers;
_collector = collector;
SetupCleanupTimer();
}
@@ -36,7 +40,7 @@ namespace C4IT_DataHistoryProvider_Base.Services
_relationTaskCleanupTimer.Start();
}
public cF4sdStagedSearchResultRelationTaskId StartGatheringRelatedObjects(IEnumerable<cFasdApiSearchResultEntry> relatedTo, int age)
public async Task<cF4sdStagedSearchResultRelationTaskId> StartGatheringRelatedObjects(IEnumerable<cFasdApiSearchResultEntry> relatedTo, int age)
{
cF4sdStagedSearchResultRelationTaskId taskId = new cF4sdStagedSearchResultRelationTaskId();
try
@@ -49,12 +53,14 @@ namespace C4IT_DataHistoryProvider_Base.Services
List<cF4sdIdentityEntry> identities = relatedTo.Select(relation => new cF4sdIdentityEntry() { Id = relation.id, Class = relatedToInformationClass }).ToList();
var _ids = await _collector.getConnectorIdList(identities, CancellationToken.None, null, age);
foreach (var collectorModule in _providers)
{
taskId.PendingInformationClasses.UnionWith(collectorModule.GetSupportedInformationClasses());
Task<cF4sdStagedSearchResultRelations> task = Task.Run(() =>
collectorModule.GetRelationsAsync(identities, relatedToInformationClass, age, relationTask.TokenSource.Token));
collectorModule.GetRelationsAsync(_ids, relatedToInformationClass, age, relationTask.TokenSource.Token));
relationTask.RelatedObjectTasks.Add((collectorModule.GetSupportedInformationClasses(), task));
}

View File

@@ -147,6 +147,13 @@ namespace F4SDwebService
if (_roles?.Count() > 0)
_retVal.Roles = _roles;
const string cockpitUserRole = "Cockpit.User";
if (!_roles.Contains(cockpitUserRole))
{
LogEntry($"bearer roles does not contain the role \"{cockpitUserRole}\"", LogLevels.Debug);
return null;
}
if (cLogManager.DefaultLogger.IsDebug)
{
var _str = JsonConvert.SerializeObject(_retVal, Formatting.Indented);

View File

@@ -14,9 +14,13 @@
<TicketConfiguration>
<DisableAutomaticTimeTracking Policy="Mandatory" Value="true" />
<CompletitionPolicy Policy="Mandatory" Value="IfRequired" />
<CompletitionPolicy Policy="Mandatory" Value="ifRequired" />
<NotesMandatory Policy="Mandatory" Value="true" />
<ShowOverview Policy="Mandatory" Value="false" />
<TicketProcessing Policy="Mandatory" Value="extern">
<TicketTypeProcessing Type="Incident" Value ="intern"/>
<TicketTypeProcessing Type="UnclassifiedTicket" Value ="both" />
</TicketProcessing>
<OpenActivitiesExternally Policy="Mandatory" Value="false">
<OpenActivityOverride ActivityType="SPSActivityTypeTicket" Value="false" />
<OpenActivityOverride ActivityType="SPSActivityTypeServiceRequest" Value="true" />
@@ -24,4 +28,9 @@
<OverviewPollingPersonal Policy="Mandatory" Value="10" />
<OverviewPollingRole Policy="Mandatory" Value="5" />
</TicketConfiguration>
<UseGamification Policy="Hidden" Value="true"/>
<IntuneConfiguration>
<TAPLifeTimeInMinutes Policy="Default" Value="60" />
<TAPIsUsableOnce Policy="Default" Value="true" />
</IntuneConfiguration>
</F4SD-Global-Configuration>

View File

@@ -252,6 +252,9 @@
<NamedParameter ParameterName="IntuneDeviceId" Name="IntuneDeviceId" Display="STRING" ValueTable="intune-deviceInfo" ValueColumn="id">
<Name Lang="DE">IntuneDeviceId</Name>
</NamedParameter>
<NamedParameter ParameterName="EmpirumDeviceId" Name="EmpirumDeviceId" Display="STRING" ValueTable="empirum-deviceInfo" ValueColumn="id">
<Name Lang="DE">EmpirumDeviceId</Name>
</NamedParameter>
<NamedParameter ParameterName="BshRegistryKeyExists" Name="BshRegistryKeyExists" Display="STRING" ValueTable="Computation_BshRegistryKeyExists" ValueColumn="default">
<Name Lang="DE">BshRegistryKeyExists</Name>
</NamedParameter>
@@ -891,6 +894,21 @@
<State-Link Reference="UserJobTitle" />
<State-Info Name="Manager" ValueTable="Computation_ManagerFilter" ValueColumn="default" />
</StateCategory>
<StateCategory Name="empirumInformationWidget">
<State-Info Name="Empirum Info" ValueTable="Computation_EmptyConstant" ValueColumn="default">
<Name Lang="DE">Empirum Informationen</Name>
</State-Info>
<State-Info Name="Empirum Id" ValueTable="empirum-deviceInfo" ValueColumn="Id">
<Name Lang="DE">Empirum Id</Name>
</State-Info>
<State-Info Name="LastInventory" ValueTable="empirum-deviceInfo" Display="DATETIME" ValueColumn="LastInventory">
<Name Lang="DE">Letzte Inventory</Name>
</State-Info>
<State-Info Name="IsPxe" ValueTable="empirum-deviceInfo" ValueColumn="IsPxe">
<Name Lang="DE">IsPxe</Name>
</State-Info>
</StateCategory>
<StateCategory Name="deviceInformationWidget">
<State-Link Reference="FullDeviceModelName" />
<State-Info Name="Serial number" ValueTable="agnt-computer" ValueColumn="SerialNumber">
@@ -1372,7 +1390,7 @@
</CategoriesStatic-Slim>
<CategoriesHistory />
</HealthCard>
<HealthCard Name="DefaultVirtualSession" InformationClass="VirtualSession">
<HealthCard Name="DefaultVirtualSession" InformationClass="VirtualSession" DefaultCopyTemplate="Ticket Information-VM">
<NamedParameters>
<NamedParameter ParameterName="VirtualSessionName" Name="Session name" Display="STRING" ValueTable="Computation_DomainRegEx" ValueColumn="default">
<Name Lang="DE">Session</Name>

View File

@@ -7,7 +7,8 @@
<Credential Name="NXT" Domain="" User="tusr_nxt_collector@c4it.intra">R0ICvoG+yjJFGXGgagNQbzAwcBacJr47wRHOIwYhBl/YGDmxpoRWrI1GZ9x1C7ofSqeE1UeZNHX/oqMo/04h+jfUrqk1QHo/6e43Lns1z7UVhWrzOlPSxYwCjv7e4+6wqTWTx6UNGR5jCeD/eHAXHW24dGu7mph9xhcB3VC1kRY=</Credential>
<Credential Name="NXCLOUD" Domain="" User="sd002">ZLAAU+jFXU/+x9FVjx4EAZRnK/D+G/OpZGkn4ek56vhDUeoR5QnSAsNu/cMa1yM3Zxa3CgmSjUmpBy+X2gr1Vo8yAeLVhqI8k9hzev+/LhrinTZIqVZZ4CaA5TEiBuNAy2uB8WEkned6uh3hRyIVNavlfoO9sToZn8f+xn8NKrM=</Credential>
<Credential Name="AGENTAPI" Domain="" User="management-client">gdZccNCwzFrAdA+qGOA9I9ChD8hJQq/4Xuc5iC2i2I+Rtp6KCRrlgqPU0Wn6zwQ8SKitRLUSeNCJcspzkpewfv0Lnb2VIDMhdDeA5zyxVss0dZqDrMgYRhZcT+odtFTX8GlWUTyqBSQpUh8YQYdggvFZkE5ZOTaFU6kqUoKAgcs=</Credential>
<Credential Name="M42API-Demo" Domain="" User="F4SD API Access">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</Credential>
<!--<Credential Name="M42API-Demo" Domain="" User="F4SD API Access">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</Credential>-->
<Credential Name="M42API-Demo-26-1" Domain="" User="F4SD API Access">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</Credential>
<!-- M42 API KEY: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1bmlxdWVfbmFtZSI6ImltYWdvdmVydW0uY29tXFx2dm9nZWwiLCJuYW1laWQiOiJpbWFnb3ZlcnVtLmNvbVxcdnZvZ2VsIiwiVXNlckZyYWdtZW50SWQiOiI3ZWRhYTljNy03YjMzLWU1MTEtODBmNi0wMDUwNTYyZjk1MTYiLCJpc3MiOiJodHRwczovL3N0cy5tYXRyaXg0Mi5jb20iLCJhdWQiOiJ1cm46bWF0cml4NDJBcGkiLCJleHAiOjIxNDc0ODM2MTIsIm5iZiI6MTY2NTU4Mzc3Mn0.MQntDtbSafCY42UDkyEHiSE8VLZX6B_EIkSg04wdrAc-->
<Credential Name="M42API-Demo-Dieter" Domain="" User="F4SD API Access">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</Credential>
<!-- M42 API KEY: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1bmlxdWVfbmFtZSI6ImltYWdvdmVydW0uY29tXFx3c21zZXJ2aWNlcyIsIm5hbWVpZCI6ImltYWdvdmVydW0uY29tXFx3c21zZXJ2aWNlcyIsIlVzZXJGcmFnbWVudElkIjoiYmZlY2IxOWUtY2MwOS1lNTExLWQzODAtMDA1MDU2MmY5NTE2IiwiaXNzIjoiaHR0cHM6Ly9zdHMubWF0cml4NDIuY29tIiwiYXVkIjoidXJuOm1hdHJpeDQyQXBpIiwiZXhwIjoyMTQ3NDgzNjA3LCJuYmYiOjE2ODMwMjI0MDd9.k4lcNXAHQfkRH28MVOZz6cONe794JoZW3wV9A0V7PAQ -->
@@ -81,7 +82,7 @@
</Azure-Tenant>
<!--<Azure-Tenant Domain="sd0024.onmicrosoft.com" TenantID="07362148-410e-4636-a9cb-795fba1a5452" Credential="AzureAccess_Dieter"/>-->
</Azure-AD>
<Matrix42-WPM Server="srvwsm001.imagoverum.com" Credential="M42API-Demo" ClosedTicketHistory="9999" DisplayName="M42 Demo server (imagoverum)" ApiTokenLifetime ="30 days" ActivityQueueFilter="ticketsAndListedQueues">
<Matrix42-WPM Server="srvwsm001.imagoverum.com" Credential="M42API-Demo-26-1" ClosedTicketHistory="9999" DisplayName="M42 Demo server (imagoverum)" ApiTokenLifetime ="30 days" ActivityQueueFilter="showAll">
<Matrix42-Ticket DisableAutomaticTimeTracking="1"
ShowDocumentCaseDialog="ifRequired"/>
<DisplayName Lang="DE">M42 Demo Server (Imagoverum)</DisplayName>

View File

@@ -1,6 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<F4SD-QuickAction-Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="F4SD-QuickAction-Configuration.xsd">
<QuickActions>
<QuickAction-Native NativeName="StartAgentRemoteConnection" RunImmediate="true" Name="Start remote connection" InformationClass="Computer" Id="690777fd-f6fe-4194-bb56-4541b111c11c">
<Name Lang="DE">Remote Verbindung starten</Name>
<Icon IconType="material" Name="ic_leak_add" />
</QuickAction-Native>
<QuickAction-Local-Script InformationClass="Computer" Name="Edit AD computer object" Id="92FC7E6A-FD2C-4DAD-90F5-02C39D0F0D0B" Section="Favourites" Params="-Name &quot;%DeviceName.Value%&quot; -DistinguishedName &quot;%ad-dn-computer.Value%&quot;" StartWithAlternateCredentials="true" RunImmediate="true" CheckFilePath="%System%\dsa.msc">
<Name Lang="DE">AD Computer Objekt bearbeiten</Name>
<Description Lang="EN">Opens Active Directory to edit the current selected computer.</Description>
@@ -933,14 +937,14 @@
</Script>
</QuickAction-Local-Script>
<QuickAction-Server Category="Intune" Action="UpdateComplianceState" Name="Update ComplianceState" ParamaterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="bc98eabc-353f-4866-bab0-681aafe48d7b">
<QuickAction-Server Category="Intune" Action="UpdateComplianceState" Name="Update ComplianceState" ParameterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="bc98eabc-353f-4866-bab0-681aafe48d7b">
<Name Lang="DE">Intune Komformitätsstatus erzwingen</Name>
<Name Lang="EN">Enforce Intune compliance state</Name>
<Description Lang="DE">Komformitätsstatus aktualisieren</Description>
<Description Lang="EN">Update compliance state</Description>
<Icon IconType="material" Name="ic_verified_user" />
</QuickAction-Server>
<QuickAction-Server Category="Intune" Action="GetBitlockerKey" ParamaterType ="deviceId" Name="Get BitlockerKey" InformationClass="Computer" Section ="Intune" Id="5123e4f8-e183-428f-bff1-b3e2afdfc745">
<QuickAction-Server Category="Intune" Action="GetBitlockerKey" ParameterType ="deviceId" Name="Get BitlockerKey" InformationClass="Computer" Section ="Intune" Id="5123e4f8-e183-428f-bff1-b3e2afdfc745">
<Name Lang="DE">Bitlocker Schlüssel anzeigen</Name>
<Name Lang="EN">Show Bitlocker recoverykey</Name>
@@ -956,14 +960,29 @@
<ColumnOutputFormatting ValueName="volumeType" Name="Volume Type" Translation ="bitlocker_volume" Display="STRING">
<Name Lang="DE">Laufwerkstyp</Name>
</ColumnOutputFormatting>
<ColumnOutputFormatting ValueName="createdDateTime" Name="Created date" Display="STRING">
<ColumnOutputFormatting ValueName="createdDateTime" Name="Created date" Display="DATETIME">
<Name Lang="DE">Erstellungsdatum </Name>
</ColumnOutputFormatting>
</ColumnOutputFormattings>
</QuickAction-Server>
</QuickAction-Server>
<QuickAction-Server Category="Intune" Action="GetTAP" ParameterType="userId" Name="Get TAP" InformationClass="User" Section="Intune" Id="44e234d3-cb38-46a3-b0e5-f86372cd2e55">
<Name Lang="DE">TAP Passwort anzeigen</Name>
<Name Lang="EN">Show TAP Password</Name>
<Description Lang="DE">TAP Passwort anzeigen</Description>
<Description Lang="EN">Show TAP Password</Description>
<Icon IconType="material" Name="ic_vpn_key" />
<ColumnOutputFormattings>
<ColumnOutputFormatting ValueName="temporaryAccessPass" Name="Access Pass" Display="STRING" IsSecret="true">
<Name Lang="DE">Passwort</Name>
</ColumnOutputFormatting>
<ColumnOutputFormatting ValueName="startDateTime" Name="Start date" Display="DATETIME">
<Name Lang="DE">Startdatum </Name>
</ColumnOutputFormatting>
</ColumnOutputFormattings>
</QuickAction-Server>
<QuickAction-Server Category="Intune" Action="GetManagedApps" Name="Get Managed Apps" ParamaterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="e798637e-a315-4d88-aec8-e6f22f9f70c7" >
<QuickAction-Server Category="Intune" Action="GetManagedApps" Name="Get Managed Apps" ParameterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="e798637e-a315-4d88-aec8-e6f22f9f70c7" >
<Name Lang="DE">Verwaltete Anwendungen anzeigen</Name>
<Name Lang="EN">Show managed applications</Name>
@@ -996,7 +1015,7 @@
</QuickAction-Local-WebRequest>
<!--<QuickAction-Server Category="Intune" Action="GetLAPS" ParamaterType ="deviceId" Name="Get LAPS" InformationClass="Computer" Section ="Intune" Id="e0446b95-81b6-4a62-82cf-7c14988957ba" >
<!--<QuickAction-Server Category="Intune" Action="GetLAPS" ParameterType ="deviceId" Name="Get LAPS" InformationClass="Computer" Section ="Intune" Id="e0446b95-81b6-4a62-82cf-7c14988957ba" >
<Name Lang="DE">LAPS Passwort anzeigen</Name>
<Name Lang="EN">Show LAPS Password</Name>
@@ -1019,7 +1038,7 @@
</QuickAction-Server>-->
<QuickAction-Server Category="Intune" Action="GetBitlockerKeyTest" ParamaterType ="deviceId" Name="Get BitlockerKeyTest" InformationClass="Computer" Section ="Intune" Id="5123e4f8-e183-428f-bff1-b3e2afdfc745">
<QuickAction-Server Category="Intune" Action="GetBitlockerKeyTest" ParameterType ="deviceId" Name="Get BitlockerKeyTest" InformationClass="Computer" Section ="Intune" Id="5123e4f8-e183-428f-bff1-b3e2afdfc745">
<Name Lang="DE">Test:Bitlocker Schlüssel anzeigen</Name>
<Name Lang="EN">Test:Show Bitlocker recoverykey</Name>
@@ -1035,13 +1054,13 @@
<ColumnOutputFormatting ValueName="volumeType" Name="Volume Type" Translation ="bitlocker_volume" Display="STRING">
<Name Lang="DE">Laufwerkstyp</Name>
</ColumnOutputFormatting>
<ColumnOutputFormatting ValueName="createdDateTime" Name="Created date" Display="STRING">
<ColumnOutputFormatting ValueName="createdDateTime" Name="Created date" Display="DATETIME">
<Name Lang="DE">Erstellungsdatum </Name>
</ColumnOutputFormatting>
</ColumnOutputFormattings>
</QuickAction-Server>
<QuickAction-Server Category="Intune" Action="GetLapsKeyTest" ParamaterType ="deviceId" Name="Get LAPSTest" InformationClass="Computer" Section ="Intune" Id="e0446b95-81b6-4a62-82cf-7c14988957ba" >
<QuickAction-Server Category="Intune" Action="GetLapsKeyTest" ParameterType ="deviceId" Name="Get LAPSTest" InformationClass="Computer" Section ="Intune" Id="e0446b95-81b6-4a62-82cf-7c14988957ba" >
<Name Lang="DE">Test:LAPS Passwort anzeigen</Name>
<Name Lang="EN">Test:Show LAPS Password</Name>
@@ -1057,14 +1076,14 @@
<ColumnOutputFormatting ValueName="passwordBase64" Name="Password" Display="STRING" IsSecret="true" >
<Name Lang="DE">Passwort</Name>
</ColumnOutputFormatting>
<ColumnOutputFormatting ValueName="backupDateTime" Name="Backup date" Display="STRING">
<ColumnOutputFormatting ValueName="backupDateTime" Name="Backup date" Display="DATETIME">
<Name Lang="DE">Sicherungsdatum </Name>
</ColumnOutputFormatting>
</ColumnOutputFormattings>
</QuickAction-Server>
<!--<QuickAction-Server Category="Intune" Action="ChangeManagedStatus" Name="Change ManagedStatus" ParamaterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="d35a9094-8068-483c-a58d-ab787657987a">
<!--<QuickAction-Server Category="Intune" Action="ChangeManagedStatus" Name="Change ManagedStatus" ParameterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="d35a9094-8068-483c-a58d-ab787657987a">
<Name Lang="DE">Verwaltungsstatus ändern</Name>
<Name Lang="EN">Change managed state</Name>
@@ -1088,7 +1107,7 @@
</AdjustableParameter-DropDown>
</AdjustableParameters>
</QuickAction-Server>-->
<!--<QuickAction-Server Category="Intune" Action="UpdateComplianceState" Name="Update ComplianceState" ParamaterType ="deviceId" InformationClass="MobileDevice" Section ="MobileDevice" Id="37453657-94a7-4e72-b8f4-eaa4b085536d">
<!--<QuickAction-Server Category="Intune" Action="UpdateComplianceState" Name="Update ComplianceState" ParameterType ="deviceId" InformationClass="MobileDevice" Section ="MobileDevice" Id="37453657-94a7-4e72-b8f4-eaa4b085536d">
<Name Lang="DE">Intune Komformitätsstatus erzwingen</Name>
<Name Lang="EN">Enforce Intune compliance state</Name>
<Description Lang="DE">Komformitätsstatus aktualisieren</Description>
@@ -1096,7 +1115,7 @@
<Icon IconType="material" Name="ic_verified_user" />
</QuickAction-Server>
<QuickAction-Server Category="Intune" Action="GetManagedApps" Name="Get Managed Apps" ParamaterType ="deviceId" InformationClass="MobileDevice" Section ="MobileDevice" Id="157212a0-8d4b-4431-b119-86d9df92ef16" >
<QuickAction-Server Category="Intune" Action="GetManagedApps" Name="Get Managed Apps" ParameterType ="deviceId" InformationClass="MobileDevice" Section ="MobileDevice" Id="157212a0-8d4b-4431-b119-86d9df92ef16" >
<Name Lang="DE">Verwaltete Anwendungen anzeigen</Name>
<Name Lang="EN">Show managed applications</Name>
@@ -1129,7 +1148,7 @@
</QuickAction-Local-WebRequest>-->
<QuickAction-Server Category="Citrix" Action="SessionLogoff" ParamaterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Session Logoff" InformationClass="VirtuelSession" Section ="Citrix" Id="da4662c3-1988-413a-a834-aec81508a8d1">
<QuickAction-Server Category="Citrix" Action="SessionLogoff" ParameterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Session Logoff" InformationClass="VirtualSession" Section ="Citrix" Id="da4662c3-1988-413a-a834-aec81508a8d1">
<Name Lang="DE">Session abmelden</Name>
<Name Lang="EN">Session logoff</Name>
<Description Lang="DE">Session Abmelden</Description>
@@ -1140,7 +1159,7 @@
</CheckNamedParameterValues>
</QuickAction-Server>
<QuickAction-Server Category="Citrix" Action="SessionHidden" ParamaterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Session Hidden" InformationClass="VirtuelSession" Section ="Citrix" Id="be8bbe9d-a9a2-4c72-9fbb-4b7feb502388">
<QuickAction-Server Category="Citrix" Action="SessionHidden" ParameterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Session Hidden" InformationClass="VirtualSession" Section ="Citrix" Id="be8bbe9d-a9a2-4c72-9fbb-4b7feb502388">
<Name Lang="DE">Session verstecken</Name>
<Name Lang="EN">Session hidden</Name>
<Description Lang="DE">Session verstecken</Description>
@@ -1151,7 +1170,7 @@
</CheckNamedParameterValues>
</QuickAction-Server>
<QuickAction-Server Category="Citrix" Action="SendMessageToSession" ParamaterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Send Message to Session" InformationClass="VirtuelSession" Section ="Citrix" Id="b7d197ef-f690-4a25-9dea-d2cf68df98b6">
<QuickAction-Server Category="Citrix" Action="SendMessageToSession" ParameterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Send Message to Session" InformationClass="VirtualSession" Section ="Citrix" Id="b7d197ef-f690-4a25-9dea-d2cf68df98b6">
<Name Lang="DE">Nachricht senden zu Session</Name>
<Name Lang="EN">Send Message to Session</Name>
@@ -1162,5 +1181,24 @@
<CheckNamedParameterValue>5</CheckNamedParameterValue>
</CheckNamedParameterValues>
</QuickAction-Server>
<QuickAction-Local-WebRequest InformationClass="Computer" Name="Open Inventory (web)" RunImmediate="true" CheckNamedParameter="EmpirumDeviceId" Section="Empirum" Id="4d6f1717-e7fd-4d22-baad-a3d3dc24efe0">
<Name Lang="DE">Empirum Inventur öffnen</Name>
<AlternativeDescription Lang="EN">This Quick Action requires information about the "Inventory of Device".</AlternativeDescription>
<AlternativeDescription Lang="DE">Um diese Quick Action verwenden zu können werden Informationen über das "Gerät" benötigt.</AlternativeDescription>
<Icon IconType="material" Name="ic_open_in_browser" />
<QueryString>https://intune.microsoft.com/#view/Microsoft_Intune_Devices/DeviceSettingsMenuBlade/~/overview/mdmDeviceId/PARAM_EmpirumDeviceId</QueryString>
<QueryParameter Name="PARAM_EmpirumDeviceId" ParameterName="EmpirumDeviceId" />
</QuickAction-Local-WebRequest>
<QuickAction-Server Category="Empirum" Action="GetInstallationStatus" ParameterType ="empirumId" Name="Get Installation Status" InformationClass="Computer" Section ="Empirum" Id="0700468d-2ae4-4875-a455-598102254c8f">
<Name Lang="DE">Nachricht senden zu Session</Name>
<Name Lang="EN">Send Message to Session</Name>
<Description Lang="DE">Nachricht senden zu Session</Description>
<Description Lang="EN">Send Message to Session</Description>
<Icon IconType="material" Name="ic_vpn_key" />
</QuickAction-Server>
</QuickActions>
</F4SD-QuickAction-Configuration>

View File

@@ -27,7 +27,7 @@
<xs:enumeration value="User" />
<xs:enumeration value="Computer" />
<xs:enumeration value="Ticket" />
<xs:enumeration value="VirtuelSession" />
<xs:enumeration value="VirtualSession" />
<xs:enumeration value="MobileDevice" />
</xs:restriction>
</xs:simpleType>
@@ -197,6 +197,16 @@
</xs:attribute>
</xs:complexType>
<xs:element name="QuickAction-Native" substitutionGroup="QuickAction">
<xs:complexType >
<xs:complexContent>
<xs:extension base="QuickAction">
<xs:attribute name="NativeName" type="xs:NCName" use="required" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:complexType name="QuickAction-Local" abstract="true">
<xs:complexContent>
<xs:extension base="QuickAction">
@@ -249,7 +259,7 @@
<xs:extension base="QuickAction-Remote">
<xs:attribute name="Category" use="optional" />
<xs:attribute name="Action" use="optional" />
<xs:attribute name="ParamaterType" use="optional" />
<xs:attribute name="ParameterType" use="optional" />
</xs:extension>
</xs:complexContent>
</xs:complexType>

View File

@@ -84,7 +84,7 @@ namespace FasdWebService.Controllers
return BadRequest();
}
[Route("api/GetCollectorStatus")]
[Route("api/CheckCollectorStatus")]
public IHttpActionResult GetCollectorStatus()
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
@@ -95,7 +95,7 @@ namespace FasdWebService.Controllers
try
{
var retVal = WebApiApplication.Collector.GetCollectorStatus(requestInfo);
var retVal = WebApiApplication.Collector.CheckCollectorStatus(requestInfo);
if (retVal != null)
return Ok(retVal);

View File

@@ -17,7 +17,7 @@ namespace F4SDwebService.Controllers
public async Task<IHttpActionResult> QuickActionRun([FromBody] cF4SDServerQuickActionParameters jsonRequest)
{
MethodBase CM = null; if (cLogManager.DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
var requestInfo = new cF4sdWebRequestInfo(jsonRequest.Action, jsonRequest.ParamaterType);
var requestInfo = new cF4sdWebRequestInfo(jsonRequest.Action, jsonRequest.ParameterType);
if (cPerformanceLogger.IsActive && requestInfo != null) { cPerformanceLogger.LogPerformanceStart(0, requestInfo.requestName, requestInfo.id, requestInfo.created); }
var apiError = 0;

View File

@@ -0,0 +1,72 @@
using C4IT.DataHistoryProvider.Base.DataSources;
using C4IT.DataHistoryProvider.Base.Modules.Agent;
using C4IT.FASD.Base;
using C4IT.FASD.Communication.Agent;
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http;
namespace F4SDwebService.Controllers
{
public class RemoteDesktopController : ApiController
{
private readonly IRemoteDesktopManager<AgentRemoteConnectionInfo, AgentRemoteClientInfo, AgentRemoteConnectionStatusDto> _remoteDesktopManager;
public RemoteDesktopController()
{
var agentConfig = WebApiApplication.Collector.F4sdAgent.GetAgentApiConfiguration(true);
_remoteDesktopManager = new AgentRemoteDesktopManager(agentConfig);
}
[HttpPost]
[Route("api/RemoteDesktop/Initiate")]
public async Task<IHttpActionResult> Initiate([FromBody] AgentRemoteClientInfo clientInfo, [FromUri] bool isElevated, CancellationToken token = default)
{
AgentRemoteConnectionInfo connection = await _remoteDesktopManager.InitiateConnectionOfClient(clientInfo, isElevated, token);
if (connection is null)
return NotFound();
else if (connection.Errors is null)
return Ok(connection);
else
return Content(System.Net.HttpStatusCode.BadRequest, connection);
}
[HttpGet]
[Route("api/RemoteDesktop/{connectionId}/Status")]
public async Task<IHttpActionResult> GetStatus(Guid connectionId)
{
AgentRemoteConnectionStatusDto status = await _remoteDesktopManager.GetConnectionStatus(connectionId);
if (status is null)
return NotFound();
return Ok(status);
}
[HttpDelete]
[Route("api/RemoteDesktop/{connectionId}/Stop")]
public async Task<IHttpActionResult> Stop(Guid connectionId)
{
await _remoteDesktopManager.TerminateConnection(connectionId);
return Ok();
}
[HttpGet]
[Route("api/RemoteDesktop/IsActive")]
public IHttpActionResult IsActive()
{
bool isActive = _remoteDesktopManager.IsActive();
return Ok(isActive);
}
[HttpGet]
[Route("api/RemoteDesktop/health")]
public async Task<IHttpActionResult> GetHealth()
{
HealthInformation healthInfo = await _remoteDesktopManager.GetHealthInfo();
return Ok(healthInfo);
}
}
}

View File

@@ -1,37 +1,52 @@
using C4IT.FASD.Base;
using C4IT_DataHistoryProvider_Base.DataSources;
using C4IT_DataHistoryProvider_Base.Services;
using System;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.Results;
using C4IT.FASD.Base;
using C4IT_DataHistoryProvider_Base.DataSources;
using C4IT_DataHistoryProvider_Base.Services;
using static C4IT.Logging.cLogManager;
namespace F4SDwebService.Controllers
{
public class StagedSearchRelationController : ApiController
{
private readonly IStagedRelationService _relationService;
private IStagedRelationService _relationService = null;
public StagedSearchRelationController()
{
_relationService = WebApiApplication.Collector.GetStagedRelationService();
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private bool checkRelationService()
{
if (_relationService == null && WebApiApplication.Collector != null)
_relationService = WebApiApplication.Collector.GetStagedRelationService();
return (_relationService != null);
}
[HttpPost]
[Route("api/StagedSearchRelations")]
public IHttpActionResult StartGatheringRelatedInformationObjects([FromBody] IEnumerable<cFasdApiSearchResultEntry> relatedTo, [FromUri] int age)
public async Task<IHttpActionResult> StartGatheringRelatedInformationObjects([FromBody] IEnumerable<cFasdApiSearchResultEntry> relatedTo, [FromUri] int age)
{
MethodBase CM = null; if (DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
cF4sdStagedSearchResultRelationTaskId taskId = _relationService.StartGatheringRelatedObjects(relatedTo, age);
if (!checkRelationService())
return NotFound();
cF4sdStagedSearchResultRelationTaskId taskId = await _relationService.StartGatheringRelatedObjects(relatedTo, age);
if (taskId.Id == Guid.Empty)
return BadRequest();
@@ -54,6 +69,9 @@ namespace F4SDwebService.Controllers
MethodBase CM = null; if (DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
if (!checkRelationService())
return NotFound();
return Ok(await _relationService.GetRelatedObjectsAsync(id, token));
}
catch (Exception ex)
@@ -72,6 +90,9 @@ namespace F4SDwebService.Controllers
MethodBase CM = null; if (DefaultLogger.IsDebug) { CM = MethodBase.GetCurrentMethod(); LogMethodBegin(CM); }
try
{
if (!checkRelationService())
return NotFound();
_relationService.StopGatheringRelatedObjects(id);
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Accepted);
return new ResponseMessageResult(response);

View File

@@ -321,6 +321,7 @@
<Compile Include="Controllers\QuickActionDataController.cs" />
<Compile Include="Controllers\LogonController.cs" />
<Compile Include="Controllers\Matrix42\Matrix42TicketFinalization.cs" />
<Compile Include="Controllers\RemoteDesktopController.cs" />
<Compile Include="Controllers\SearchDefault.cs" />
<Compile Include="Controllers\F4SDAnalyticsDataController.cs" />
<Compile Include="Controllers\TicketOverviewController.cs" />

View File

@@ -131,6 +131,9 @@ namespace F4SDwebService
if (Collector.M42WpmCollector != null)
await Collector.M42WpmCollector.ValidateConnectionAsync(true, CancellationToken.None);
if (Collector.CitrixCollector != null)
await Collector.CitrixCollector.ValidateConnectionsAsync(CancellationToken.None);
Collector.ServerStatus = C4IT.FASD.Base.enumWebServerStatus.active;
}
catch (Exception E)

View File

@@ -1,12 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<C4IT-License-Info Product="First Aid Service Desk (F4SD)" Id="776D99A6-D341-4B70-BA4B-2CC55B76A079">
<License Id="FAE53860-0AE2-4A15-A5D5-7E56D4D29FDE" Revision="1.0" Type="PRODUCTIVE" Customer="Consulting4IT" CustomerId="A3A5E66E-6A91-44E2-9F3A-F04C67642BCB" StartDate="2024-12-01" EndDate="2026-12-31" Signature="A3u3fZ5bU5p3CikLiOyCMdrsJCLtvQkdbUcIhPfo0gZruL4jvy/cXGeqwHgCNK4P+vVJi+7XtxfBvefTFVAs4QT2vSP+m7DPj1CB//zLOEhUHQVqim3KyQiIWtlMi/hruO+XKL6BAOYuNsSOR3eit95e9JPc60qNNL4gArdGe5I=">
<License-Metrics Type="ManagedUsers" Count="10000" />
<Modules>
<Module Name="F4SD client agent connector" Id="F8A3284C-E481-4D08-A921-949D2EBD4E0B" />
<Module Name="MS Active Directory connector" Id="B2D48023-56E8-44D5-AB77-BE1DCF4EA4EB" />
<Module Name="Matrix42 WPM conntector" Id="9CE1A6BE-6A0C-4A27-94A5-44AB997B8E62" />
<Module Name="Nexthink NXQL conntector" Id="51EA7764-3AD3-4F90-89DB-DEB0C60D655C" />
</Modules>
</License>
<License Id="FAE53860-0AE2-4A15-A5D5-7E56D4D29FDE" Revision="1.0" Type="PRODUCTIVE" Customer="Consulting4IT" CustomerId="A3A5E66E-6A91-44E2-9F3A-F04C67642BCB" StartDate="2024-12-01" EndDate="2026-12-31" Signature="Mv5Xfm31zvnWth+kyd8PDcQJYFTW1Pnc2Hv2eeexBBJ/tQzlL3jj0gU0c7lBmdhzwoWj3LAzNDtmB0pNQcTKQLIKmaWucG2AoBCXrGIijOToefFFQFOLFv+lr2bmNW7iR1wg8EWI0l1Uft/Tei6tF9ddjgMzFCb7FzI9OWfSvOo=">
<License-Metrics Type="ManagedUsers" Count="10000" />
<Modules>
<Module Name="Citrix Virtual Apps and Desktops connector" Id="F2DA5E05-FD3C-4182-9164-9C722140BF85" />
<Module Name="MS Active Directory connector" Id="B2D48023-56E8-44D5-AB77-BE1DCF4EA4EB" />
<Module Name="Nexthink NXQL conntector" Id="51EA7764-3AD3-4F90-89DB-DEB0C60D655C" />
<Module Name="Matrix42 WPM connector" Id="9CE1A6BE-6A0C-4A27-94A5-44AB997B8E62" />
<Module Name="F4SD client agent connector" Id="F8A3284C-E481-4D08-A921-949D2EBD4E0B" />
</Modules>
</License>
</C4IT-License-Info>

View File

@@ -14,9 +14,13 @@
<TicketConfiguration>
<DisableAutomaticTimeTracking Policy="Mandatory" Value="true" />
<CompletitionPolicy Policy="Mandatory" Value="IfRequired" />
<CompletitionPolicy Policy="Mandatory" Value="ifRequired" />
<NotesMandatory Policy="Mandatory" Value="true" />
<ShowOverview Policy="Mandatory" Value="false" />
<TicketProcessing Policy="Mandatory" Value="extern">
<TicketTypeProcessing Type="Incident" Value ="intern"/>
<TicketTypeProcessing Type="UnclassifiedTicket" Value ="both" />
</TicketProcessing>
<OpenActivitiesExternally Policy="Mandatory" Value="false">
<OpenActivityOverride ActivityType="SPSActivityTypeTicket" Value="false" />
<OpenActivityOverride ActivityType="SPSActivityTypeServiceRequest" Value="true" />
@@ -24,4 +28,9 @@
<OverviewPollingPersonal Policy="Mandatory" Value="10" />
<OverviewPollingRole Policy="Mandatory" Value="5" />
</TicketConfiguration>
<UseGamification Policy="Hidden" Value="true"/>
<IntuneConfiguration>
<TAPLifeTimeInMinutes Policy="Default" Value="60" />
<TAPIsUsableOnce Policy="Default" Value="true" />
</IntuneConfiguration>
</F4SD-Global-Configuration>

View File

@@ -18,11 +18,29 @@
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TicketTypeEnum">
<xs:restriction base="xs:NCName">
<xs:enumeration value="Ticket"/>
<xs:enumeration value="UnclassifiedTicket"/>
<xs:enumeration value="Incident"/>
<xs:enumeration value="ServiceRequest"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TicketCompletitionPolicyEnum">
<xs:restriction base="xs:NCName">
<xs:enumeration value="ifRequired"/>
<xs:enumeration value="IfRequired"/>
<xs:enumeration value="false"/>
<xs:enumeration value="true"/>
<xs:enumeration value="never"/>
<xs:enumeration value="always"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TicketProcessingEnum">
<xs:restriction base="xs:NCName">
<xs:enumeration value="intern"/>
<xs:enumeration value="extern"/>
<xs:enumeration value="both"/>
</xs:restriction>
</xs:simpleType>
@@ -76,6 +94,14 @@
</xs:element>
<xs:element ref="InformationClassSearchPriority" minOccurs="0" maxOccurs="1"/>
<xs:element ref="TicketConfiguration" minOccurs="0" maxOccurs="1"/>
<xs:element name="UseGamification" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>
<xs:extension base="BoolNode"></xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element ref="IntuneConfiguration" minOccurs="0" maxOccurs="1" />
</xs:all>
</xs:complexType>
</xs:element>
@@ -131,6 +157,22 @@
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="TicketProcessing" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="TicketTypeProcessing" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="Type" type="TicketTypeEnum" use="required"/>
<xs:attribute name="Value" type="TicketProcessingEnum" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="Policy" type="PolicyEnum" use="required"/>
<xs:attribute name="Value" type="TicketProcessingEnum" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="OpenActivitiesExternally" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
@@ -145,6 +187,7 @@
<xs:attribute name="Value" type="xs:boolean" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="OverviewPollingPersonal" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>
@@ -166,5 +209,29 @@
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="IntuneConfiguration">
<xs:complexType>
<xs:all>
<xs:element name="TAPLifeTimeInMinutes" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>
<xs:extension base="PolicyNode">
<xs:attribute name="Value" type="xs:positiveInteger" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="TAPIsUsableOnce" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:complexContent>
<xs:extension base="BoolNode"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -252,6 +252,9 @@
<NamedParameter ParameterName="IntuneDeviceId" Name="IntuneDeviceId" Display="STRING" ValueTable="intune-deviceInfo" ValueColumn="id">
<Name Lang="DE">IntuneDeviceId</Name>
</NamedParameter>
<NamedParameter ParameterName="EmpirumDeviceId" Name="EmpirumDeviceId" Display="STRING" ValueTable="empirum-deviceInfo" ValueColumn="id">
<Name Lang="DE">EmpirumDeviceId</Name>
</NamedParameter>
<NamedParameter ParameterName="BshRegistryKeyExists" Name="BshRegistryKeyExists" Display="STRING" ValueTable="Computation_BshRegistryKeyExists" ValueColumn="default">
<Name Lang="DE">BshRegistryKeyExists</Name>
</NamedParameter>
@@ -891,6 +894,21 @@
<State-Link Reference="UserJobTitle" />
<State-Info Name="Manager" ValueTable="Computation_ManagerFilter" ValueColumn="default" />
</StateCategory>
<StateCategory Name="empirumInformationWidget">
<State-Info Name="Empirum Info" ValueTable="Computation_EmptyConstant" ValueColumn="default">
<Name Lang="DE">Empirum Informationen</Name>
</State-Info>
<State-Info Name="Empirum Id" ValueTable="empirum-deviceInfo" ValueColumn="Id">
<Name Lang="DE">Empirum Id</Name>
</State-Info>
<State-Info Name="LastInventory" ValueTable="empirum-deviceInfo" Display="DATETIME" ValueColumn="LastInventory">
<Name Lang="DE">Letzte Inventory</Name>
</State-Info>
<State-Info Name="IsPxe" ValueTable="empirum-deviceInfo" ValueColumn="IsPxe">
<Name Lang="DE">IsPxe</Name>
</State-Info>
</StateCategory>
<StateCategory Name="deviceInformationWidget">
<State-Link Reference="FullDeviceModelName" />
<State-Info Name="Serial number" ValueTable="agnt-computer" ValueColumn="SerialNumber">
@@ -1372,7 +1390,7 @@
</CategoriesStatic-Slim>
<CategoriesHistory />
</HealthCard>
<HealthCard Name="DefaultVirtualSession" InformationClass="VirtualSession">
<HealthCard Name="DefaultVirtualSession" InformationClass="VirtualSession" DefaultCopyTemplate="Ticket Information-VM">
<NamedParameters>
<NamedParameter ParameterName="VirtualSessionName" Name="Session name" Display="STRING" ValueTable="Computation_DomainRegEx" ValueColumn="default">
<Name Lang="DE">Session</Name>

View File

@@ -7,7 +7,8 @@
<Credential Name="NXT" Domain="" User="tusr_nxt_collector@c4it.intra">R0ICvoG+yjJFGXGgagNQbzAwcBacJr47wRHOIwYhBl/YGDmxpoRWrI1GZ9x1C7ofSqeE1UeZNHX/oqMo/04h+jfUrqk1QHo/6e43Lns1z7UVhWrzOlPSxYwCjv7e4+6wqTWTx6UNGR5jCeD/eHAXHW24dGu7mph9xhcB3VC1kRY=</Credential>
<Credential Name="NXCLOUD" Domain="" User="sd002">ZLAAU+jFXU/+x9FVjx4EAZRnK/D+G/OpZGkn4ek56vhDUeoR5QnSAsNu/cMa1yM3Zxa3CgmSjUmpBy+X2gr1Vo8yAeLVhqI8k9hzev+/LhrinTZIqVZZ4CaA5TEiBuNAy2uB8WEkned6uh3hRyIVNavlfoO9sToZn8f+xn8NKrM=</Credential>
<Credential Name="AGENTAPI" Domain="" User="management-client">gdZccNCwzFrAdA+qGOA9I9ChD8hJQq/4Xuc5iC2i2I+Rtp6KCRrlgqPU0Wn6zwQ8SKitRLUSeNCJcspzkpewfv0Lnb2VIDMhdDeA5zyxVss0dZqDrMgYRhZcT+odtFTX8GlWUTyqBSQpUh8YQYdggvFZkE5ZOTaFU6kqUoKAgcs=</Credential>
<Credential Name="M42API-Demo" Domain="" User="F4SD API Access">a2btKvTS6UnTiD3vTaLX4JjQe3YB8iOpgqwDD3Imy9QzfIZwOBkKuI+jZDtea9VPpFsO6P7pVPmL5y3eZQpVe9oBlw74Ve0hMvX+RrNjAO5DINbBNG8JxZ4gPIMQsUnYVVkHH3pvoiJIJ8AlctQuMEQ2v2slnOvEhTMWiJF2vzQWPgY7vCu6hp92AJvalKIOmK6qT3u7gf45L06R16hpzxD73DbmYwEnMs1ZuF9e1NrLdXRBr+/m4/K8RneZf/hLnW70JJm1IfA/PEVYUEk5HG0fWZFTnsBI3xNXuxXg4OdiR/7Bcrmpj36ATEU6XfWnJBP5qZwhvNzIdMMcDLOnk52b56Szjr5wEOSJIvG93knmZJAFPDIqnRY9BLYtZb6rZ6sCpLMD7R97HKhUy0CFgNNY43CniAtIiARpnGFpdxPISSWeVFsqrckEDeya4hUpZQRUf7T53nTnOBFMuygDgWxfJnMxEl0tg6m5kfAhkguyFDRueA/XkSs0bXQ8xuERBZpKCWA7TJZnMbljK9G22VMYPFCJbB8hHkBjW49wsM8rF0MAS2KvweJdvFjclhqRNSH6sXHKTh4r870YYhYXNnrqobikmP81ZCoq6avKH10/1UPJJAQjBT4MwM488M7TfPv4q9l0ezi7v91fnl2MORRlZljoQ57ao6flIf/KCgQhxl20PtYPz4TcRU/onZ5OKRDXEgaWpkJZkt4ZZX2NgjIvEI8wTEATY3Eu2dBOKeWKD7jwhkPJtnRka8+miNSFanhwJ78WjIx1B/s9jMJ2njCMAzsabjVDMZPwedXigz67zcSl3NnCg4ycCukPnk/Vs2r90XjYKOCuvlU6CsTCeQLLX28Y2AaABY+7vQIEV3XPZVc4kimy6EEShfNZkkLNHQjoZqVXkFp8AKxWCZLzJOFyGFTAX0UqsN9O6soJ/rzAF68ByjYT2y9iggA8GDYUAHZxe0fX/b01+8D+I14c9qPctBaEPhJ2DjYOfJhKRglP1nkIX6U/wd0A19brME7fr50k/ndYpavzGOhVFHrcnxufn6CDJ9/8XeeQ3XdqHwCnYT4G0dUBDEQXcCGWJa0KVkefl4vW25A8Uz5aa4yQoOj7wsnJdLVoijClWEj4a7AWP1AaH9l+dQels1ek7nJ5M8BgjGK5QSSbSrgdNLVRTRZ8PxsSdSjs1tXpSZB6SfSIWW0l48HADpUdmJjr8RlARLvpeHJs+Sqw03TnAPZo+0NOrjrfFnH0UNCVcIaNYwunMhp76s77sUpmozOxL0s95hXNlGPRcJMF5kxTXzV5hbTFr0ZsG/33gmbup9Vo9OJza9EeSbQUZj26TWotabTFrrzU/OgboiHWUmXM9HSwrXatWsCjdOr602+Hve5eDcbYUMAWvXz77QfniJgj54dM4kdNRP3e4iWQRD/EW2crlacOPEyqCGYoHm+BlgtXg2IUUYxuqYJi3/RAn0TZzEKe9oDET2jc7RRRXUzglPVU6LPnw4qPbpu054GVDfddTvPthIPKBwyB21laqmFIDRCqkcmOuVuXBxhF5DLJh7dXl7Azo3X1R7sBhX3gFOynvbDYoGmxpxetR0rKxWP9toh/UPubuYYTtOeAuLGdhIFu9LdeV/LkRHeHlFgtaZjd/CmmHavRMiKs8rKlXCRQAJYIu6DzcDCjkDfOOhEKOoi9PVzCJsLahRmlsvty+bVrbgZwNJoBH9p50dx+5rw9diNKXJrY5zCl5YnacXDHQ7lY4VV8a0f7I3zGOffTYSbADOrQ+V35YQIkzQ8yBNTKHxkKUY+qR4YHkN5P3Wq/xhZkVwAO1UEMyjdZCyibAMnvNsGSZiZSvn1374ygn1xL/gKU7nGGh4xtBU3cCzHkxfWMSDmk3m9Gp7cdFd8/jr0TLaLT1roEO6/Btdwh17XSFU2xUQzYieMIESuZuO/NzEem0V8qtT7Jh3AkfXumzvhBysc2PG0/ydghgL8kO+42zU+bslPhk+hQ7w1UouGNhtMgMi31sjxizjoeS7z2v7qCmC8P9ho3Lsexxoefj/pJ3wgF</Credential>
<!--<Credential Name="M42API-Demo" Domain="" User="F4SD API Access">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</Credential>-->
<Credential Name="M42API-Demo-26-1" Domain="" User="F4SD API Access">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</Credential>
<!-- M42 API KEY: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1bmlxdWVfbmFtZSI6ImltYWdvdmVydW0uY29tXFx2dm9nZWwiLCJuYW1laWQiOiJpbWFnb3ZlcnVtLmNvbVxcdnZvZ2VsIiwiVXNlckZyYWdtZW50SWQiOiI3ZWRhYTljNy03YjMzLWU1MTEtODBmNi0wMDUwNTYyZjk1MTYiLCJpc3MiOiJodHRwczovL3N0cy5tYXRyaXg0Mi5jb20iLCJhdWQiOiJ1cm46bWF0cml4NDJBcGkiLCJleHAiOjIxNDc0ODM2MTIsIm5iZiI6MTY2NTU4Mzc3Mn0.MQntDtbSafCY42UDkyEHiSE8VLZX6B_EIkSg04wdrAc-->
<Credential Name="M42API-Demo-Dieter" Domain="" User="F4SD API Access">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</Credential>
<!-- M42 API KEY: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1bmlxdWVfbmFtZSI6ImltYWdvdmVydW0uY29tXFx3c21zZXJ2aWNlcyIsIm5hbWVpZCI6ImltYWdvdmVydW0uY29tXFx3c21zZXJ2aWNlcyIsIlVzZXJGcmFnbWVudElkIjoiYmZlY2IxOWUtY2MwOS1lNTExLWQzODAtMDA1MDU2MmY5NTE2IiwiaXNzIjoiaHR0cHM6Ly9zdHMubWF0cml4NDIuY29tIiwiYXVkIjoidXJuOm1hdHJpeDQyQXBpIiwiZXhwIjoyMTQ3NDgzNjA3LCJuYmYiOjE2ODMwMjI0MDd9.k4lcNXAHQfkRH28MVOZz6cONe794JoZW3wV9A0V7PAQ -->
@@ -81,7 +82,7 @@
</Azure-Tenant>
<!--<Azure-Tenant Domain="sd0024.onmicrosoft.com" TenantID="07362148-410e-4636-a9cb-795fba1a5452" Credential="AzureAccess_Dieter"/>-->
</Azure-AD>
<Matrix42-WPM Server="srvwsm001.imagoverum.com" Credential="M42API-Demo" ClosedTicketHistory="9999" DisplayName="M42 Demo server (imagoverum)" ApiTokenLifetime ="30 days" ActivityQueueFilter="ticketsAndListedQueues">
<Matrix42-WPM Server="srvwsm001.imagoverum.com" Credential="M42API-Demo-26-1" ClosedTicketHistory="9999" DisplayName="M42 Demo server (imagoverum)" ApiTokenLifetime ="30 days" ActivityQueueFilter="showAll">
<Matrix42-Ticket DisableAutomaticTimeTracking="1"
ShowDocumentCaseDialog="ifRequired"/>
<DisplayName Lang="DE">M42 Demo Server (Imagoverum)</DisplayName>

View File

@@ -391,12 +391,18 @@
</xs:complexType>
</xs:element>
<xs:complexType name="CitrixSystemType">
<xs:attribute name="Name" type="xs:string" use="required"/>
<xs:attribute name="SiteID" type="guid" use="optional"/>
<xs:attribute name="Credential" type="xs:NCName" use="required"/>
</xs:complexType>
<xs:element name="Citrix">
<xs:complexType>
<xs:sequence>
<xs:element ref="Scan-Timing" maxOccurs="1" minOccurs="0"/>
<xs:element ref="Citrix-Tenant" maxOccurs="unbounded" minOccurs="1"/>
<xs:element ref="Citrix-Cloud-Tenant" maxOccurs="unbounded" minOccurs="0"/>
<xs:element ref="Citrix-OnPrem-System" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="UniqueCitrixTenants">
@@ -405,14 +411,17 @@
</xs:unique>
</xs:element>
<xs:element name="Citrix-Tenant">
<xs:element name="Citrix-Cloud-Tenant">
<xs:complexType>
<xs:sequence>
</xs:sequence>
<xs:attribute name="Domain" type="xs:string" use="required"/>
<xs:attribute name="TenantID" type="xs:string" use="required"/>
<xs:attribute name="InstanceID" type="guid" use="required"/>
<xs:attribute name="Credential" type="xs:NCName" use="required"/>
<xs:complexContent>
<xs:extension base="CitrixSystemType">
<xs:attribute name="Name" type="xs:string" use="required"/>
<xs:attribute name="Domain" type="xs:string" use="required"/>
<xs:attribute name="TenantID" type="xs:string" use="required"/>
<xs:attribute name="SiteID" type="guid" use="optional"/>
<xs:attribute name="Credential" type="xs:NCName" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:keyref name="CitrixTenantCredentialRef" refer="CredentialId">
<xs:selector xpath="."/>
@@ -420,6 +429,15 @@
</xs:keyref>
</xs:element>
<xs:element name="Citrix-OnPrem-System">
<xs:complexType>
<xs:attribute name="Name" type="xs:string" use="required"/>
<xs:attribute name="Server" type="xs:string" use="required"/>
<xs:attribute name="SiteID" type="guid" use="optional"/>
<xs:attribute name="Credential" type="xs:NCName" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="Active-Directory">
<xs:complexType>
<xs:sequence>

View File

@@ -1,6 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<F4SD-QuickAction-Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="F4SD-QuickAction-Configuration.xsd">
<QuickActions>
<QuickAction-Native NativeName="StartAgentRemoteConnection" RunImmediate="true" Name="Start remote connection" InformationClass="Computer" Id="690777fd-f6fe-4194-bb56-4541b111c11c">
<Name Lang="DE">Remote Verbindung starten</Name>
<Icon IconType="material" Name="ic_leak_add" />
</QuickAction-Native>
<QuickAction-Local-Script InformationClass="Computer" Name="Edit AD computer object" Id="92FC7E6A-FD2C-4DAD-90F5-02C39D0F0D0B" Section="Favourites" Params="-Name &quot;%DeviceName.Value%&quot; -DistinguishedName &quot;%ad-dn-computer.Value%&quot;" StartWithAlternateCredentials="true" RunImmediate="true" CheckFilePath="%System%\dsa.msc">
<Name Lang="DE">AD Computer Objekt bearbeiten</Name>
<Description Lang="EN">Opens Active Directory to edit the current selected computer.</Description>
@@ -933,14 +937,14 @@
</Script>
</QuickAction-Local-Script>
<QuickAction-Server Category="Intune" Action="UpdateComplianceState" Name="Update ComplianceState" ParamaterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="bc98eabc-353f-4866-bab0-681aafe48d7b">
<QuickAction-Server Category="Intune" Action="UpdateComplianceState" Name="Update ComplianceState" ParameterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="bc98eabc-353f-4866-bab0-681aafe48d7b">
<Name Lang="DE">Intune Komformitätsstatus erzwingen</Name>
<Name Lang="EN">Enforce Intune compliance state</Name>
<Description Lang="DE">Komformitätsstatus aktualisieren</Description>
<Description Lang="EN">Update compliance state</Description>
<Icon IconType="material" Name="ic_verified_user" />
</QuickAction-Server>
<QuickAction-Server Category="Intune" Action="GetBitlockerKey" ParamaterType ="deviceId" Name="Get BitlockerKey" InformationClass="Computer" Section ="Intune" Id="5123e4f8-e183-428f-bff1-b3e2afdfc745">
<QuickAction-Server Category="Intune" Action="GetBitlockerKey" ParameterType ="deviceId" Name="Get BitlockerKey" InformationClass="Computer" Section ="Intune" Id="5123e4f8-e183-428f-bff1-b3e2afdfc745">
<Name Lang="DE">Bitlocker Schlüssel anzeigen</Name>
<Name Lang="EN">Show Bitlocker recoverykey</Name>
@@ -956,14 +960,29 @@
<ColumnOutputFormatting ValueName="volumeType" Name="Volume Type" Translation ="bitlocker_volume" Display="STRING">
<Name Lang="DE">Laufwerkstyp</Name>
</ColumnOutputFormatting>
<ColumnOutputFormatting ValueName="createdDateTime" Name="Created date" Display="STRING">
<ColumnOutputFormatting ValueName="createdDateTime" Name="Created date" Display="DATETIME">
<Name Lang="DE">Erstellungsdatum </Name>
</ColumnOutputFormatting>
</ColumnOutputFormattings>
</QuickAction-Server>
</QuickAction-Server>
<QuickAction-Server Category="Intune" Action="GetTAP" ParameterType="userId" Name="Get TAP" InformationClass="User" Section="Intune" Id="44e234d3-cb38-46a3-b0e5-f86372cd2e55">
<Name Lang="DE">TAP Passwort anzeigen</Name>
<Name Lang="EN">Show TAP Password</Name>
<Description Lang="DE">TAP Passwort anzeigen</Description>
<Description Lang="EN">Show TAP Password</Description>
<Icon IconType="material" Name="ic_vpn_key" />
<ColumnOutputFormattings>
<ColumnOutputFormatting ValueName="temporaryAccessPass" Name="Access Pass" Display="STRING" IsSecret="true">
<Name Lang="DE">Passwort</Name>
</ColumnOutputFormatting>
<ColumnOutputFormatting ValueName="startDateTime" Name="Start date" Display="DATETIME">
<Name Lang="DE">Startdatum </Name>
</ColumnOutputFormatting>
</ColumnOutputFormattings>
</QuickAction-Server>
<QuickAction-Server Category="Intune" Action="GetManagedApps" Name="Get Managed Apps" ParamaterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="e798637e-a315-4d88-aec8-e6f22f9f70c7" >
<QuickAction-Server Category="Intune" Action="GetManagedApps" Name="Get Managed Apps" ParameterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="e798637e-a315-4d88-aec8-e6f22f9f70c7" >
<Name Lang="DE">Verwaltete Anwendungen anzeigen</Name>
<Name Lang="EN">Show managed applications</Name>
@@ -996,7 +1015,7 @@
</QuickAction-Local-WebRequest>
<!--<QuickAction-Server Category="Intune" Action="GetLAPS" ParamaterType ="deviceId" Name="Get LAPS" InformationClass="Computer" Section ="Intune" Id="e0446b95-81b6-4a62-82cf-7c14988957ba" >
<!--<QuickAction-Server Category="Intune" Action="GetLAPS" ParameterType ="deviceId" Name="Get LAPS" InformationClass="Computer" Section ="Intune" Id="e0446b95-81b6-4a62-82cf-7c14988957ba" >
<Name Lang="DE">LAPS Passwort anzeigen</Name>
<Name Lang="EN">Show LAPS Password</Name>
@@ -1019,7 +1038,7 @@
</QuickAction-Server>-->
<QuickAction-Server Category="Intune" Action="GetBitlockerKeyTest" ParamaterType ="deviceId" Name="Get BitlockerKeyTest" InformationClass="Computer" Section ="Intune" Id="5123e4f8-e183-428f-bff1-b3e2afdfc745">
<QuickAction-Server Category="Intune" Action="GetBitlockerKeyTest" ParameterType ="deviceId" Name="Get BitlockerKeyTest" InformationClass="Computer" Section ="Intune" Id="5123e4f8-e183-428f-bff1-b3e2afdfc745">
<Name Lang="DE">Test:Bitlocker Schlüssel anzeigen</Name>
<Name Lang="EN">Test:Show Bitlocker recoverykey</Name>
@@ -1035,13 +1054,13 @@
<ColumnOutputFormatting ValueName="volumeType" Name="Volume Type" Translation ="bitlocker_volume" Display="STRING">
<Name Lang="DE">Laufwerkstyp</Name>
</ColumnOutputFormatting>
<ColumnOutputFormatting ValueName="createdDateTime" Name="Created date" Display="STRING">
<ColumnOutputFormatting ValueName="createdDateTime" Name="Created date" Display="DATETIME">
<Name Lang="DE">Erstellungsdatum </Name>
</ColumnOutputFormatting>
</ColumnOutputFormattings>
</QuickAction-Server>
<QuickAction-Server Category="Intune" Action="GetLapsKeyTest" ParamaterType ="deviceId" Name="Get LAPSTest" InformationClass="Computer" Section ="Intune" Id="e0446b95-81b6-4a62-82cf-7c14988957ba" >
<QuickAction-Server Category="Intune" Action="GetLapsKeyTest" ParameterType ="deviceId" Name="Get LAPSTest" InformationClass="Computer" Section ="Intune" Id="e0446b95-81b6-4a62-82cf-7c14988957ba" >
<Name Lang="DE">Test:LAPS Passwort anzeigen</Name>
<Name Lang="EN">Test:Show LAPS Password</Name>
@@ -1057,14 +1076,14 @@
<ColumnOutputFormatting ValueName="passwordBase64" Name="Password" Display="STRING" IsSecret="true" >
<Name Lang="DE">Passwort</Name>
</ColumnOutputFormatting>
<ColumnOutputFormatting ValueName="backupDateTime" Name="Backup date" Display="STRING">
<ColumnOutputFormatting ValueName="backupDateTime" Name="Backup date" Display="DATETIME">
<Name Lang="DE">Sicherungsdatum </Name>
</ColumnOutputFormatting>
</ColumnOutputFormattings>
</QuickAction-Server>
<!--<QuickAction-Server Category="Intune" Action="ChangeManagedStatus" Name="Change ManagedStatus" ParamaterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="d35a9094-8068-483c-a58d-ab787657987a">
<!--<QuickAction-Server Category="Intune" Action="ChangeManagedStatus" Name="Change ManagedStatus" ParameterType ="deviceId" InformationClass="Computer" Section ="Intune" Id="d35a9094-8068-483c-a58d-ab787657987a">
<Name Lang="DE">Verwaltungsstatus ändern</Name>
<Name Lang="EN">Change managed state</Name>
@@ -1088,7 +1107,7 @@
</AdjustableParameter-DropDown>
</AdjustableParameters>
</QuickAction-Server>-->
<!--<QuickAction-Server Category="Intune" Action="UpdateComplianceState" Name="Update ComplianceState" ParamaterType ="deviceId" InformationClass="MobileDevice" Section ="MobileDevice" Id="37453657-94a7-4e72-b8f4-eaa4b085536d">
<!--<QuickAction-Server Category="Intune" Action="UpdateComplianceState" Name="Update ComplianceState" ParameterType ="deviceId" InformationClass="MobileDevice" Section ="MobileDevice" Id="37453657-94a7-4e72-b8f4-eaa4b085536d">
<Name Lang="DE">Intune Komformitätsstatus erzwingen</Name>
<Name Lang="EN">Enforce Intune compliance state</Name>
<Description Lang="DE">Komformitätsstatus aktualisieren</Description>
@@ -1096,7 +1115,7 @@
<Icon IconType="material" Name="ic_verified_user" />
</QuickAction-Server>
<QuickAction-Server Category="Intune" Action="GetManagedApps" Name="Get Managed Apps" ParamaterType ="deviceId" InformationClass="MobileDevice" Section ="MobileDevice" Id="157212a0-8d4b-4431-b119-86d9df92ef16" >
<QuickAction-Server Category="Intune" Action="GetManagedApps" Name="Get Managed Apps" ParameterType ="deviceId" InformationClass="MobileDevice" Section ="MobileDevice" Id="157212a0-8d4b-4431-b119-86d9df92ef16" >
<Name Lang="DE">Verwaltete Anwendungen anzeigen</Name>
<Name Lang="EN">Show managed applications</Name>
@@ -1129,7 +1148,7 @@
</QuickAction-Local-WebRequest>-->
<QuickAction-Server Category="Citrix" Action="SessionLogoff" ParamaterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Session Logoff" InformationClass="VirtuelSession" Section ="Citrix" Id="da4662c3-1988-413a-a834-aec81508a8d1">
<QuickAction-Server Category="Citrix" Action="SessionLogoff" ParameterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Session Logoff" InformationClass="VirtualSession" Section ="Citrix" Id="da4662c3-1988-413a-a834-aec81508a8d1">
<Name Lang="DE">Session abmelden</Name>
<Name Lang="EN">Session logoff</Name>
<Description Lang="DE">Session Abmelden</Description>
@@ -1140,7 +1159,7 @@
</CheckNamedParameterValues>
</QuickAction-Server>
<QuickAction-Server Category="Citrix" Action="SessionHidden" ParamaterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Session Hidden" InformationClass="VirtuelSession" Section ="Citrix" Id="be8bbe9d-a9a2-4c72-9fbb-4b7feb502388">
<QuickAction-Server Category="Citrix" Action="SessionHidden" ParameterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Session Hidden" InformationClass="VirtualSession" Section ="Citrix" Id="be8bbe9d-a9a2-4c72-9fbb-4b7feb502388">
<Name Lang="DE">Session verstecken</Name>
<Name Lang="EN">Session hidden</Name>
<Description Lang="DE">Session verstecken</Description>
@@ -1151,7 +1170,7 @@
</CheckNamedParameterValues>
</QuickAction-Server>
<QuickAction-Server Category="Citrix" Action="SendMessageToSession" ParamaterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Send Message to Session" InformationClass="VirtuelSession" Section ="Citrix" Id="b7d197ef-f690-4a25-9dea-d2cf68df98b6">
<QuickAction-Server Category="Citrix" Action="SendMessageToSession" ParameterType ="sessionId" CheckNamedParameter="VirtualSessionStatus" Name="Send Message to Session" InformationClass="VirtualSession" Section ="Citrix" Id="b7d197ef-f690-4a25-9dea-d2cf68df98b6">
<Name Lang="DE">Nachricht senden zu Session</Name>
<Name Lang="EN">Send Message to Session</Name>
@@ -1162,5 +1181,24 @@
<CheckNamedParameterValue>5</CheckNamedParameterValue>
</CheckNamedParameterValues>
</QuickAction-Server>
<QuickAction-Local-WebRequest InformationClass="Computer" Name="Open Inventory (web)" RunImmediate="true" CheckNamedParameter="EmpirumDeviceId" Section="Empirum" Id="4d6f1717-e7fd-4d22-baad-a3d3dc24efe0">
<Name Lang="DE">Empirum Inventur öffnen</Name>
<AlternativeDescription Lang="EN">This Quick Action requires information about the "Inventory of Device".</AlternativeDescription>
<AlternativeDescription Lang="DE">Um diese Quick Action verwenden zu können werden Informationen über das "Gerät" benötigt.</AlternativeDescription>
<Icon IconType="material" Name="ic_open_in_browser" />
<QueryString>https://intune.microsoft.com/#view/Microsoft_Intune_Devices/DeviceSettingsMenuBlade/~/overview/mdmDeviceId/PARAM_EmpirumDeviceId</QueryString>
<QueryParameter Name="PARAM_EmpirumDeviceId" ParameterName="EmpirumDeviceId" />
</QuickAction-Local-WebRequest>
<QuickAction-Server Category="Empirum" Action="GetInstallationStatus" ParameterType ="empirumId" Name="Get Installation Status" InformationClass="Computer" Section ="Empirum" Id="0700468d-2ae4-4875-a455-598102254c8f">
<Name Lang="DE">Nachricht senden zu Session</Name>
<Name Lang="EN">Send Message to Session</Name>
<Description Lang="DE">Nachricht senden zu Session</Description>
<Description Lang="EN">Send Message to Session</Description>
<Icon IconType="material" Name="ic_vpn_key" />
</QuickAction-Server>
</QuickActions>
</F4SD-QuickAction-Configuration>

View File

@@ -27,7 +27,7 @@
<xs:enumeration value="User" />
<xs:enumeration value="Computer" />
<xs:enumeration value="Ticket" />
<xs:enumeration value="VirtuelSession" />
<xs:enumeration value="VirtualSession" />
<xs:enumeration value="MobileDevice" />
</xs:restriction>
</xs:simpleType>
@@ -197,6 +197,16 @@
</xs:attribute>
</xs:complexType>
<xs:element name="QuickAction-Native" substitutionGroup="QuickAction">
<xs:complexType >
<xs:complexContent>
<xs:extension base="QuickAction">
<xs:attribute name="NativeName" type="xs:NCName" use="required" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:complexType name="QuickAction-Local" abstract="true">
<xs:complexContent>
<xs:extension base="QuickAction">
@@ -249,7 +259,7 @@
<xs:extension base="QuickAction-Remote">
<xs:attribute name="Category" use="optional" />
<xs:attribute name="Action" use="optional" />
<xs:attribute name="ParamaterType" use="optional" />
<xs:attribute name="ParameterType" use="optional" />
</xs:extension>
</xs:complexContent>
</xs:complexType>

View File

@@ -1,12 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<C4IT-License-Info Product="First Aid Service Desk (F4SD)" Id="776D99A6-D341-4B70-BA4B-2CC55B76A079">
<License Id="FAE53860-0AE2-4A15-A5D5-7E56D4D29FDE" Revision="1.0" Type="PRODUCTIVE" Customer="Consulting4IT" CustomerId="A3A5E66E-6A91-44E2-9F3A-F04C67642BCB" StartDate="2024-12-01" EndDate="2026-12-31" Signature="A3u3fZ5bU5p3CikLiOyCMdrsJCLtvQkdbUcIhPfo0gZruL4jvy/cXGeqwHgCNK4P+vVJi+7XtxfBvefTFVAs4QT2vSP+m7DPj1CB//zLOEhUHQVqim3KyQiIWtlMi/hruO+XKL6BAOYuNsSOR3eit95e9JPc60qNNL4gArdGe5I=">
<License-Metrics Type="ManagedUsers" Count="10000" />
<Modules>
<Module Name="F4SD client agent connector" Id="F8A3284C-E481-4D08-A921-949D2EBD4E0B" />
<Module Name="MS Active Directory connector" Id="B2D48023-56E8-44D5-AB77-BE1DCF4EA4EB" />
<Module Name="Matrix42 WPM conntector" Id="9CE1A6BE-6A0C-4A27-94A5-44AB997B8E62" />
<Module Name="Nexthink NXQL conntector" Id="51EA7764-3AD3-4F90-89DB-DEB0C60D655C" />
</Modules>
</License>
<License Id="FAE53860-0AE2-4A15-A5D5-7E56D4D29FDE" Revision="1.0" Type="PRODUCTIVE" Customer="Consulting4IT" CustomerId="A3A5E66E-6A91-44E2-9F3A-F04C67642BCB" StartDate="2024-12-01" EndDate="2026-12-31" Signature="Mv5Xfm31zvnWth+kyd8PDcQJYFTW1Pnc2Hv2eeexBBJ/tQzlL3jj0gU0c7lBmdhzwoWj3LAzNDtmB0pNQcTKQLIKmaWucG2AoBCXrGIijOToefFFQFOLFv+lr2bmNW7iR1wg8EWI0l1Uft/Tei6tF9ddjgMzFCb7FzI9OWfSvOo=">
<License-Metrics Type="ManagedUsers" Count="10000" />
<Modules>
<Module Name="Citrix Virtual Apps and Desktops connector" Id="F2DA5E05-FD3C-4182-9164-9C722140BF85" />
<Module Name="MS Active Directory connector" Id="B2D48023-56E8-44D5-AB77-BE1DCF4EA4EB" />
<Module Name="Nexthink NXQL conntector" Id="51EA7764-3AD3-4F90-89DB-DEB0C60D655C" />
<Module Name="Matrix42 WPM connector" Id="9CE1A6BE-6A0C-4A27-94A5-44AB997B8E62" />
<Module Name="F4SD client agent connector" Id="F8A3284C-E481-4D08-A921-949D2EBD4E0B" />
</Modules>
</License>
</C4IT-License-Info>

View File

@@ -3,7 +3,7 @@ set ProductName="C4IT First Aid ServiceDesk (F4SD)"
set SignTool=..\..\Common Code\Tools\signtool.exe
set TimeStamp=http://rfc3161timestamp.globalsign.com/advanced
"%SignTool%" sign /a /tr %TimeStamp% /td SHA256 /fd SHA256 /d %ProductName% ".\Source\bin\F4SD-Cockpit-Collector.exe" ".\Source\bin\F4SD-Cockpit-WebService.dll" ".\Source\bin\F4SD-Cockpit-Server.dll" ".\Source\bin\C4IT.F4SD.DisplayFormatting.dll"
"%SignTool%" sign /a /tr %TimeStamp% /td SHA256 /fd SHA256 /d %ProductName% ".\Source\bin\F4SD-Cockpit-Collector.exe" ".\Source\bin\F4SD-Cockpit-WebService.dll" ".\Source\bin\F4SD-Cockpit-Server.dll" ".\Source\bin\C4IT.F4SD.DisplayFormatting.dll" ".\Source\bin\C4IT.F4SD.SupportCaseProtocoll.dll"
pause