Laden...

Forenbeiträge von Fabiano Ingesamt 27 Beiträge

29.01.2024 - 16:50 Uhr

Hallo Abt, vielen Dank für deine schnelle Antwort!

Tut mir leid für die ungenaue Quellenangabe, aber ich möchte da "aus Quellenschutzgründen" nicht genauer werden. Es handelt sich einfach um einen mir bekannten Entwickler!

Was meinst du genau mit "noch gewisse offizielle Unterstützung für .NET Framework"? Gemäss Microsoft steht für 4.7+ noch gar kein EOL Datum fest?

29.01.2024 - 14:58 Uhr

Hallo Forum!

Ich bin gerade über die Aussage eines Entwicklers gestolpert, wonach .NET8 nicht auf Windows IoT 10/11 verfügbar sein soll. Leider finde ich keine belastbaren Infos, um die Aussage entweder zu bestätigen oder zu wiederlegen, und ein Windows IoT zum Testen hab ich auch nicht zur Hand. Wie sieht denn das nun aus?

Grüsse,
Fabiano

11.11.2022 - 11:03 Uhr

Hallo Leute!

Ich versuche gerade, Assemblies zu signiern. Leider werden die ohne digitale Signatur generiert (kein Reiter "Digitale Signaturen" in den Dateieigenschaften) und irgendwelche Fehlermeldungen erhalte ich auch nicht. Das wäre das Csproj:


<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <SignAssembly>true</SignAssembly>
    <AssemblyOriginatorKeyFile>codesigning.pfx</AssemblyOriginatorKeyFile>
  </PropertyGroup>
</Project>

Die einzige C#-Datei ist die unangetastete Program.cs. Irgendjemand eine Idee, in welche Richtung ich überhaupt suchen könnte? Die ganzen Google-Ergebnisse soweit gehen halt davon aus, dass es klappt und sind deshalb nicht wirklich hilfreich!

08.10.2022 - 11:19 Uhr

Ah, du meinst, dass ich die Typnamen zum Mappen/Adden selbst aus einer Datei bzw einer ConfigSection entnehme?
Nicht schlecht, daran hab ich gar nicht gedacht! Ist zwar anfangs etwas umständlicher, aber dafür auch flexibler!

08.10.2022 - 04:26 Uhr

Hallo zusammen!

Die Frage ist vielleicht einfach, aber ich habe per Google wiklich keine passenden Ergebnisse erhalten.
Ich möchte solche Zeilen:

services.AddScoped<IMyService, MyServiceImplementation>();

durch Konfiguration per Textdatei ersetzen. Das leider nicht mehr weiterentwickelte Unity konnte das und die Funktionalität ist gerade für's Testing ein Riesenvorteil. Lässt sich das auch mit Microsoft.Extensions.DependencyInjection machen?

20.07.2022 - 09:58 Uhr

Hallo zusammen!

Ich habe ein Problem beim Restoren eines Projektes:

R:\source\solution1-project1\src\Solution1.Project1.SubProject1\Solution1.Project1.SubProject1.csproj : error NU1106: Unable to satisfy conflicting requests for 'Solution2.Project1': externalProject/
	Solution2.Project1 (>= 1.1.1) (via project/Solution1.Project1.SubProject1 2.1.13),
	Solution2.Project1 (>= 1.1.1) (via project/Solution3.Project1 2.0.1),
	Solution2.Project1 (>= 1.1.1) (via project/Solution2.Project2.SubProject1 1.1.2)
	Framework: (.NETFramework,Version=v4.6.2) [R:\source\solution1-project1\Solution1.Project1.sln]

Laut Microsoft soll ich in den Projektdateien "more open-ended ranges for the dependency rather than an exact version" spezifiziern. Aber das bringt auch keine Veränderung und eigentlich passt die Version 1.1.1 ja.

Irgendjemand eine Ahnung, wie ich das Problem beheben könnte?

05.07.2022 - 17:21 Uhr

Hallo zusammen!

Ich habe eine Applikation, die gegen mehrere selbstentwickelte Libraries linkt und möchte die daher bei Debug-Builds via Projektreferenz im VS einbinden, bei Release-Builds hingegen als Nuget-Paket. Gibt es da irgendeine Möglichkeit, die ich bisher übersehen habe? Leider finde ich bei Google nichts, kann aber sein, dass ich die falschen Keywords verwende.

Vielen Dank für eure Antworten!

02.07.2021 - 15:59 Uhr

Hallo zusammen!

Wenn ich in einem Clickhandler eine async-Methode awaite, funktioniert das problemlos:

        private async void Knopf_Click(object sender, RoutedEventArgs e)
        {
            var id = "BluetoothLE#BluetoothLE12:34:56:78:90:12-12:34:56:78:90:12";
            var dev = await BluetoothLEDevice.FromIdAsync(id);                      // funktioniert
            //var dev = Creator.GetDevice(id, Application.Current.Dispatcher.Invoke); // funktioniert nicht
            Text.Text = dev.DeviceId;
        }

Der gleiche Code in einer Library funktionert aber nicht:

        public static BluetoothLEDevice GetDevice(string deviceId, Func<Func<Task>,Task> invoke)
        {
            BluetoothLEDevice ret = null;
            invoke(async () => {
                ret = await BluetoothLEDevice.FromIdAsync(deviceId);
            });
            return ret;
        }

Hier wird nicht wirklich awaitet, sondern ret bleibt null.
Wie kann ich durchsetzen, dass auf die Rückkehr von BluetoothLEDevice.FromIdAsync gewaitet wird?

Liebe Grüsse,
Fabiano

25.06.2021 - 16:40 Uhr

Ja, das erwarte ich von Enrich.WithClientIp(), dass das die Variable hinzufügt.
Wozu ist denn das sonst gut? Nur damit ich das versteh, mein ich. Will hier niemanden kritisiern, nur hat der Entwickler das genauso angegeben, ausser dass er das Output Template setzt, was bei mir ebenfalls nicht funktioniert...

25.06.2021 - 16:14 Uhr

Serilog schaut vielversprechend aus, aber ich kriege nicht einmal die Client IP geloggt. Ich habe:

  1. Ein neues WebAPI-Projekt erstellt
  2. Folgende Pakete installiert:
    Serilog
    Serilog.AspNetCore
    Serilog.Enrichers.ClientInfo
    Serilog.Sinks.Console
  3. Folgende Dateien angepasst:
    Program.cs
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Serilog;

namespace Tests.SerilogWeb
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder => {
                    webBuilder.UseStartup<Startup>();
                })
                .UseSerilog(new LoggerConfiguration() // Logger instanziern
                    .MinimumLevel.Debug()
                    .Enrich.WithClientIp()
                    .WriteTo.Console()
                    .CreateLogger()
                );
    }
}

Startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.OpenApi.Models;
using Serilog;

namespace Tests.SerilogWeb
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "Tests.SerilogWeb", Version = "v1" });
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment()) {
                app
                    .UseDeveloperExceptionPage()
                    .UseSwagger()
                    .UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Tests.SerilogWeb v1"));
            }
            app
                .UseSerilogRequestLogging() // <- Hinzugefügt
                .UseHttpsRedirection()
                .UseRouting()
                .UseAuthorization()
                .UseEndpoints(endpoints => {
                    endpoints.MapControllers();
                });
        }
    }
}

WeatherForecastController.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Tests.SerilogWeb.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            _logger.LogInformation("Hier sollte die ClientIp stehen: ->{ClientIp}<-");
            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}

Geloggt wird aber der String ohne Ersetzung der IP, also
Hier sollte die ClientIp stehen: ->{ClientIp}<-
statt z.B.
Hier sollte die ClientIp stehen: ->192.168.1.42<-

Hat hier jemand eine Idee?

25.06.2021 - 11:20 Uhr

Hallo zusammen!

Ich möchte in einem Server in Logmeldungen die Client-Ip mitloggen und analog zum LogLevel-Filter die Meldungen auf solche spezifischer Clients reduziern.
Also so wie ich das LogLevel von ERROR auf DEBUG stellen kann, möchte ich eine Liste von IPs konfiguriern, deren Logmeldungen geschrieben werden sollen, während alle anderen ignoriert werden.
Gibt es ein Loggingframework, das sowas bietet?

Vielen Dank für eure Antworten!

17.06.2021 - 12:12 Uhr

Sorry wegen dem .Result, das verwende ich in produktivem Code natürlich nicht! 😉

Leider bringt dein Link nichts, weil die Klasse BluetoothComponent Legacy-Code ist (InTheHand.Net.Bluetooth statt InTheHand.Bluetooth).
Aber im Prinzip bräuchte ich genau sowas bei der LE-Library, die jedoch InTheHand.BluetoothLE heisst und nicht InTheHand.Bluetooth.
Weisst du da wie? Leider ist sein Code sehr chaotisch und ich steige nicht so durch.

Vielen Dank für deine Hilfe!

15.06.2021 - 18:50 Uhr

Hallo Abt!

Vielen Dank für deine Antwort! Es hat mir sehr geholfen, wenn auch indirekt.
Mein Problem war nämlich, dass ich die Methoden für Bluetooth <4 verwendet habe, es sich bei meinen Geräten aber um BluetoothLE (4+) Dinger handelt...😉
Dieser Code funktioniert soweit:

        static void Main(string[] args)
        {
            Console.WriteLine("Discovering...");
            var devices = InTheHand.Bluetooth.Bluetooth.ScanForDevicesAsync().Result;
            Console.WriteLine("Listing...");
            foreach (var device in devices) {
                Console.WriteLine($"\t{device.Name}");
            }
            Console.WriteLine("Finished.");
            Console.ReadKey();
        }

Jetzt möchte ich das Ganze aber noch awaiten und einen Handler jedes Gerät direkt nach den "Finden" in eine ObservableCollection hinzufügen.
Leider scheint Bluetooth.AdvertisementReceived dafür nicht vorgesehen zu sein (jedenfalls wird das Event nie ausgelöst) und ein anderes finde ich nicht.
Hast du irgendeine Idee?

Vielen Dank für deine Hilfe!

Gruss
Fabiano

15.06.2021 - 12:46 Uhr

Hallo Leute!

Ich möchte eine WPF-Applikation erstellen, in der alle BT-Geräte zur Auswahl angezeigt werden. Leider fliegt auf Google/StackOverflow viel verschiedener Code rum, und tatsächlich schlagen auch auf Anhieb beide von mir versuchten Ansätze fehl. Es werden keine BT-Geräte zurückgegeben, obwohl das Betriebssystem sehr wohl welche findet.

Der erste Versuch:

BTTests.ThirtyTwoFeetNET.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFrameworks>net48</TargetFrameworks>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="32feet.NET" Version="3.5.0" />
  </ItemGroup>

</Project>

MainWindow.xaml.cs

using InTheHand.Net.Sockets;
using System.Windows;

namespace BTTests.ThirtyTwoFeetNET
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            using (var client = new BluetoothClient()) {
                foreach (var device in client.DiscoverDevicesInRange()) {
                    MessageBox.Show(device.DeviceName);
                }
            }
        }
    }
}

Und der zweite:

BTTests.MWSC.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFrameworks>net48</TargetFrameworks>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Windows.SDK.Contracts" Version="10.0.19041.1" />
  </ItemGroup>

</Project>

MainWindow.xaml.cs

using System.Windows;
using Windows.Devices.Enumeration;

namespace BTTests.MWSC
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            var picker = new DevicePicker();
            picker.Show(new Windows.Foundation.Rect(Left, Top, Width, Height));
        }
    }
}

Hat hier jemand sowas am Laufen? Oder komme ich um eine UWP nicht herum?
UWP möchte ich eigentlich vermeiden, da ich bisher mit WPF arbeite.
Der Einfachheit halber habe ich auch noch die VS Solution angehängt.

Vielen Dank für eure Hilfe!

21.04.2021 - 17:37 Uhr

Ich stecke wieder fest, und zwar erhalte ich beim Compiliern der Mapper folgende Fehler (Projekt Fipscode.ORM.Test):> Fehlermeldung:

(9,49): error CS0234: The type or namespace name 'SloganMapper' does not exist in the namespace 'Fipscode.ORM.Dapper.Fipscode.Entities.Test' (are you missing an assembly reference?)
(10,13): error CS0012: The type 'User' is defined in an assembly that is not referenced. You must add a reference to assembly 'Fipscode.Entities.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Könntet ihr euch das vielleicht nochmal ansehen? 😉
Der zu kompilierende Sourcecode wird auch ausgegeben, zum besseren Verständnis.

20.04.2021 - 23:43 Uhr

Lass mich raten: Du meinst Portscanner und willst per TCP herausfinden, welche IP das "Programm" bekommen hat, bzw auf welchem lokalen Port es lauscht?
Dazu böte sich System.Net.Sockets.TcpClient an.
Aber vielleicht erklärst du mal genauer, was du vorhast? 😉

20.04.2021 - 20:19 Uhr

Hallo jogibear9988

Diese 2 Zeilen von dir haben meinen Tag gerettet! Ach was, die ganze Woche! 🙂

                MetadataReference.CreateFromFile(Assembly.Load("netstandard").Location),
                MetadataReference.CreateFromFile(Assembly.Load("System.Runtime").Location)

Nochmals vielen Dank euch beiden, dass ihr euch gekümmert habt! Einen wunderschönen Abend!

Gruss,
Fabiano

20.04.2021 - 20:15 Uhr

Hallo gfoidl

Vielen Dank für deine Unterstützung!
Es geht mir nicht um das CodeGenerator-Projekt, sondern um ORM.Test.
Die Solution kompiliert bei mir auch, aber wenn ich das ORM.Test-Projekt ausführe, kommen diese Fehler:> Fehlermeldung:

(5,32): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(9,13): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(9,13): error CS0012: The type 'Expression<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(9,30): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(10,13): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(10,13): error CS0012: The type 'Expression<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(10,33): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.

Klappt das bei dir?

Ich möchte wie gesagt auch keinen Source generieren, sondern fertige Typen.

Gruss,
Fabiano

20.04.2021 - 16:44 Uhr

Vielen Dank für deine Antwort!

Leider hat das auch keinen Einfluss. Das CLI ist (natürlich) netcoreapp3.1, aber der ganze Rest netstandard2.0.
Könntest du dir das kurz anschauen? So wie ich mich kenne, liegt es an was ganz Blödem...🙁

Gruss,
Fabiano

20.04.2021 - 12:56 Uhr

Vielen Dank für deine schnelle Antwort!

Der Typ soll natürlich zur Laufzeit generiert werden, generierter Source oder gar eine Installation von VS kann ich nicht voraussetzen.
Im Prinzip hätt ich auch per System.Reflection.Emit.GetILGenerator direkt Bytecode erzeugen können, aber das ist mir zu hoch! 😉

20.04.2021 - 12:30 Uhr

Hallo Leute!

Visual Studio 2019, 16.9.4
Microsoft.CodeAnalysis.CSharp 3.9.0

Ich möchte Dapper ORM-Mappings dynamisch erstellen und verwende dazu folgenden Code:


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Emit;
using DFM = Dapper.FluentMap.Mapping;

namespace Fips.ORM.Dapper
{
    public class MappersCreator
    {
        private Type CreateType(Type type, string name, Dictionary<string,string> mappings)
        {
            var assemblyName = type.Assembly.FullName;
            var nspace = type.Namespace;
            var sb = new StringBuilder();
            foreach (var kv in mappings) {
                sb.Append($"            Map(m => m.{kv.Key}).ToColumn(\"{kv.Value}\");\n");
            }
            var code = $@"using Dapper.FluentMap.Mapping;

namespace {nspace}
{{
    public class {name}Mapper : EntityMap<{name}>
    {{
        public {name}Mapper()
        {{
{sb.ToString()}
        }}
    }}
}}";
            SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(code);
            CSharpCompilation compilation = CSharpCompilation.Create(
                assemblyName,
                new[] { syntaxTree },
                new MetadataReference[] {
                    MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
                    MetadataReference.CreateFromFile(type.Assembly.Location),
                    MetadataReference.CreateFromFile(typeof(DFM.EntityMap<Type>).Assembly.Location),
                    MetadataReference.CreateFromFile(typeof(Expression<Type>).Assembly.Location),
                    MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location),
                },
                new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
            );
            using (var memoryStream = new MemoryStream()) {
                EmitResult result = compilation.Emit(memoryStream);
                if (result.Success) {
                    memoryStream.Seek(0, SeekOrigin.Begin);
                    Assembly assembly = Assembly.Load(memoryStream.ToArray());
                    Type ret = assembly.GetType($"{nspace}.{name}");
                    return ret;
                } else {
                    foreach (var diagnostic in result.Diagnostics) {
                        Console.WriteLine(diagnostic);
                    }
                    return null;
                }
            }
        }
    }
}

Leider kriege ich nur folgende Fehler bei compilation.Emit(memoryStream) auf Zeile 51:> Fehlermeldung:

(5,32): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(9,13): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(9,13): error CS0012: The type 'Expression<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(9,30): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(10,13): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(10,13): error CS0012: The type 'Expression<>' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.
(10,33): error CS0012: The type 'Object' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.

Das ist mein CSPROJ-File:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Dapper" Version="2.0.78" />
    <PackageReference Include="Dapper.FluentMap" Version="2.0.0" />
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.9.0" />
  </ItemGroup>

  <ItemGroup>
    <Reference Include="System.Linq" />
    <Reference Include="System.Linq.Expressions" />
    <Reference Include="netstandard" />
  </ItemGroup>
</Project>

Warum werden meine Referenzenangaben auf den Zeilen 42 und 45 (scheinbar) einfach ignoriert? Oder was ist sonst der Fehler?

Liebe Grüsse,
Fabiano

19.04.2021 - 18:19 Uhr

Zum Nachtrag: Es lag dann schlussendlich doch an einem ungültigen Zertifikat.

11.01.2021 - 16:38 Uhr

Klappt auch nicht, dann kommt nur ein System.Runtime.InteropServices.COMException: 'Unknown error (0x80005000)' an der gleichen Stelle.

11.01.2021 - 15:14 Uhr

Hier noch das zweite Bild

11.01.2021 - 15:07 Uhr

Ah, tut mir leid wegen der Bilder, hab sie nun angehängt.

Hab nun AuthenticationTypes.SecureSocketsLayer in AuthenticationTypes.Encryption geändert und bekomme immer noch die gleiche Exception geschmissen. Aber gemäss AuthenticationTypes Enum hat der Enum-Member ohnehin den gleichen Wert?

11.01.2021 - 13:46 Uhr

Hallo Abt! Vielen Dank für deine schnelle Antwort!

Ich muss per LDAPS auf das Directory zugreifen, auch von ausserhalb der Domäne.
Kerberos ist dafür offensichtilich nicht notwendig, da es mit Apache Directory Studio ebenfalls geht (ohne Kerberos)

11.01.2021 - 12:33 Uhr

Hallo zusammen!

Hab kein AD-spezifisches Subforum gefunden und poste daher hier.
Folgendes C#-Programm funktioniert wie erwartet, wenn es auf dem DC oder einem Member Server ausgeführt wird:

using System;
using System.DirectoryServices;

namespace Tests.LDAP {
    class Program {
        static void Main(string[] args) {
            var server = "dc.domain.example.com";
            var port = 636;
            var container = "CN=Users,DC=domain,DC=example,DC=com";
            var path = $"LDAP://{server}:{port}/{{0}}{container}";
            var user = "Administrator@domain.example.com";
            var password = "s0m3p4ssw0rd";
            var de = new DirectoryEntry(string.Format(path, "CN=User Name,"), user, password, AuthenticationTypes.SecureSocketsLayer);
            var prop = de.Properties["cn"]; // <-- Hier wird die Exception geworfen
            Console.WriteLine($"cn: {prop}");
            Console.ReadKey();
        }
    }
}

Wenn ich das Programm aber ausserhalb der Domäne laufen lasse, wird folgende Exception geworfen:

Unhandled Exception: System.Runtime.InteropServices.COMException: The server is not operational.
   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.PropertyValueCollection.PopulateList()
   at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
   at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
   at Tests.LDAP.Program.Main(String[] args) in C:\source\Tests\Tests.LDAP\Program.cs:line 17

Wenn ich mit Apache Directory Studio mit folgenden Einstellungen verbinde, funktioniert alles problemlos:
Edit Abt: Bilder-Links entfernt.

Es muss sich also um ein Library- oder ein API-Benutzungsproblem handeln.
Hat hier jemand einen Tipp, wie ich das zum Laufen bekommen kann?