https stuff and cert generator for the webserver
This commit is contained in:
1 parent
3f18832b38
commit
33252ab19c
15 files changed
+2077
-33
No files matched your search
@@ -0,0 +1,63 @@
|
|||||||
|
###############################################################################
|
||||||
|
# Set default behavior to automatically normalize line endings.
|
||||||
|
###############################################################################
|
||||||
|
* text=auto
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Set default behavior for command prompt diff.
|
||||||
|
#
|
||||||
|
# This is need for earlier builds of msysgit that does not have it on by
|
||||||
|
# default for csharp files.
|
||||||
|
# Note: This is only used by command line
|
||||||
|
###############################################################################
|
||||||
|
#*.cs diff=csharp
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Set the merge driver for project and solution files
|
||||||
|
#
|
||||||
|
# Merging from the command prompt will add diff markers to the files if there
|
||||||
|
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||||
|
# the diff markers are never inserted). Diff markers may cause the following
|
||||||
|
# file extensions to fail to load in VS. An alternative would be to treat
|
||||||
|
# these files as binary and thus will always conflict and require user
|
||||||
|
# intervention with every merge. To do so, just uncomment the entries below
|
||||||
|
###############################################################################
|
||||||
|
#*.sln merge=binary
|
||||||
|
#*.csproj merge=binary
|
||||||
|
#*.vbproj merge=binary
|
||||||
|
#*.vcxproj merge=binary
|
||||||
|
#*.vcproj merge=binary
|
||||||
|
#*.dbproj merge=binary
|
||||||
|
#*.fsproj merge=binary
|
||||||
|
#*.lsproj merge=binary
|
||||||
|
#*.wixproj merge=binary
|
||||||
|
#*.modelproj merge=binary
|
||||||
|
#*.sqlproj merge=binary
|
||||||
|
#*.wwaproj merge=binary
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# behavior for image files
|
||||||
|
#
|
||||||
|
# image files are treated as binary by default.
|
||||||
|
###############################################################################
|
||||||
|
#*.jpg binary
|
||||||
|
#*.png binary
|
||||||
|
#*.gif binary
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# diff behavior for common document formats
|
||||||
|
#
|
||||||
|
# Convert binary document formats to text before diffing them. This feature
|
||||||
|
# is only available from the command line. Turn it on by uncommenting the
|
||||||
|
# entries below.
|
||||||
|
###############################################################################
|
||||||
|
#*.doc diff=astextplain
|
||||||
|
#*.DOC diff=astextplain
|
||||||
|
#*.docx diff=astextplain
|
||||||
|
#*.DOCX diff=astextplain
|
||||||
|
#*.dot diff=astextplain
|
||||||
|
#*.DOT diff=astextplain
|
||||||
|
#*.pdf diff=astextplain
|
||||||
|
#*.PDF diff=astextplain
|
||||||
|
#*.rtf diff=astextplain
|
||||||
|
#*.RTF diff=astextplain
|
||||||
@@ -5,6 +5,9 @@ using System.Text;
|
|||||||
using System.ServiceModel;
|
using System.ServiceModel;
|
||||||
using System.ServiceModel.Description;
|
using System.ServiceModel.Description;
|
||||||
using System.ServiceModel.Web;
|
using System.ServiceModel.Web;
|
||||||
|
using System.Security.Cryptography.X509Certificates;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Net;
|
||||||
|
|
||||||
namespace ClientServerLib
|
namespace ClientServerLib
|
||||||
{
|
{
|
||||||
@@ -12,6 +15,7 @@ namespace ClientServerLib
|
|||||||
{
|
{
|
||||||
private ServiceHost host;
|
private ServiceHost host;
|
||||||
private Uri baseAddress;
|
private Uri baseAddress;
|
||||||
|
private bool encrypted = false;
|
||||||
|
|
||||||
private static SendKeyEventDelegate sendKeyEvent;
|
private static SendKeyEventDelegate sendKeyEvent;
|
||||||
public static SendKeyEventDelegate SendKeyEvent
|
public static SendKeyEventDelegate SendKeyEvent
|
||||||
@@ -92,10 +96,25 @@ namespace ClientServerLib
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public CServer(int port)
|
public CServer(int port, bool encrypted)
|
||||||
{
|
{
|
||||||
baseAddress = new Uri("http://localhost:" + port + "/");
|
init(port, encrypted);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void init(int port, bool encrypted)
|
||||||
|
{
|
||||||
|
string hostname = Dns.GetHostName();
|
||||||
|
if (encrypted)
|
||||||
|
{
|
||||||
|
baseAddress = new Uri("https://" + hostname + ":" + port + "/");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
baseAddress = new Uri("http://" + hostname + ":" + port + "/");
|
||||||
|
}
|
||||||
|
this.encrypted = encrypted;
|
||||||
host = new WebServiceHost(typeof(CWebservice), baseAddress);
|
host = new WebServiceHost(typeof(CWebservice), baseAddress);
|
||||||
|
|
||||||
WebHttpBinding wb = new WebHttpBinding();
|
WebHttpBinding wb = new WebHttpBinding();
|
||||||
wb.MaxReceivedMessageSize = 10485760;
|
wb.MaxReceivedMessageSize = 10485760;
|
||||||
wb.MaxBufferSize = 10485760;
|
wb.MaxBufferSize = 10485760;
|
||||||
@@ -103,6 +122,11 @@ namespace ClientServerLib
|
|||||||
wb.ReaderQuotas.MaxStringContentLength = 10485760;
|
wb.ReaderQuotas.MaxStringContentLength = 10485760;
|
||||||
wb.ReaderQuotas.MaxArrayLength = 10485760;
|
wb.ReaderQuotas.MaxArrayLength = 10485760;
|
||||||
wb.ReaderQuotas.MaxBytesPerRead = 10485760;
|
wb.ReaderQuotas.MaxBytesPerRead = 10485760;
|
||||||
|
if (encrypted)
|
||||||
|
{
|
||||||
|
wb.Security.Mode = WebHttpSecurityMode.Transport;
|
||||||
|
wb.Security.Transport = new HttpTransportSecurity { ClientCredentialType = HttpClientCredentialType.None };
|
||||||
|
}
|
||||||
host.AddServiceEndpoint(typeof(ICWebservice), wb, "");
|
host.AddServiceEndpoint(typeof(ICWebservice), wb, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,18 +134,33 @@ namespace ClientServerLib
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Step 4 Enable metadata exchange.
|
/*ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
|
||||||
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
|
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
|
||||||
//smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
|
smb.HttpGetEnabled = true;
|
||||||
//smb.HttpGetEnabled = true;
|
host.Description.Behaviors.Add(smb);*/
|
||||||
host.Description.Behaviors.Add(smb);
|
|
||||||
|
|
||||||
// Step 5 Start the service.
|
|
||||||
host.Open();
|
host.Open();
|
||||||
}
|
}
|
||||||
catch (CommunicationException ce)
|
catch (CommunicationException e)
|
||||||
{
|
{
|
||||||
host.Abort();
|
if (e is AddressAccessDeniedException || e is AddressAlreadyInUseException)
|
||||||
|
{
|
||||||
|
registerUrlAndCert(baseAddress.Port);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
host.Abort();
|
||||||
|
init(baseAddress.Port, encrypted);
|
||||||
|
host.Open();
|
||||||
|
}
|
||||||
|
catch (CommunicationException e2)
|
||||||
|
{
|
||||||
|
host.Abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
host.Abort();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,10 +170,27 @@ namespace ClientServerLib
|
|||||||
{
|
{
|
||||||
host.Close();
|
host.Close();
|
||||||
}
|
}
|
||||||
catch (CommunicationException ce)
|
catch (CommunicationException e)
|
||||||
{
|
{
|
||||||
host.Abort();
|
host.Abort();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void registerUrlAndCert(int port)
|
||||||
|
{
|
||||||
|
ProcessStartInfo info = new ProcessStartInfo();
|
||||||
|
info.FileName = "WebserverInitalConfig.exe";
|
||||||
|
info.Arguments = port.ToString() + " " + encrypted.ToString();
|
||||||
|
info.UseShellExecute = true;
|
||||||
|
info.CreateNoWindow = true;
|
||||||
|
info.WindowStyle = ProcessWindowStyle.Hidden;
|
||||||
|
info.Verb = "runas";
|
||||||
|
Process p = Process.Start(info);
|
||||||
|
if (p != null)
|
||||||
|
{
|
||||||
|
p.WaitForExit();
|
||||||
|
p.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
using Security.Cryptography;
|
||||||
|
using Security.Cryptography.X509Certificates;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Security.Cryptography.X509Certificates;
|
||||||
|
using System.Security.Permissions;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace ConfigHttpApi
|
||||||
|
{
|
||||||
|
public static class ConfigHttpApi
|
||||||
|
{
|
||||||
|
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]
|
||||||
|
public static void reserveURL(string networkString)
|
||||||
|
{
|
||||||
|
HttpApi.ReserveURL(networkString, "D:(A;;GX;;;S-1-1-0)");
|
||||||
|
}
|
||||||
|
|
||||||
|
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]
|
||||||
|
public static void bindCert(string ip, int port, X509Certificate2 cert)
|
||||||
|
{
|
||||||
|
IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(ip), port);
|
||||||
|
if (HttpApi.QuerySslCertificateInfo(endpoint) != null)
|
||||||
|
{
|
||||||
|
HttpApi.DeleteCertificateBinding(endpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpApi.BindCertificate(endpoint, cert.GetCertHash(), StoreName.My, new Guid("7baf41f1-48b7-42cb-b145-f815499cb48f"));
|
||||||
|
}
|
||||||
|
|
||||||
|
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]
|
||||||
|
public static void addCertToStore(X509Certificate2 cert)
|
||||||
|
{
|
||||||
|
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
|
||||||
|
store.Open(OpenFlags.ReadWrite);
|
||||||
|
store.Add(cert);
|
||||||
|
store.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
[PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")]
|
||||||
|
public static X509Certificate2 getSelfSignedCert(string subjectName)
|
||||||
|
{
|
||||||
|
CngKey key = CngKey.Create(CngAlgorithm2.Rsa);
|
||||||
|
X509CertificateCreationParameters param = new X509CertificateCreationParameters(
|
||||||
|
new X500DistinguishedName("CN=Vocaluxe Server"));
|
||||||
|
param.SubjectName = new X500DistinguishedName("CN=localhost");
|
||||||
|
param.EndTime = DateTime.Today.AddYears(20);
|
||||||
|
param.SignatureAlgorithm = X509CertificateSignatureAlgorithm.RsaSha512;
|
||||||
|
OidCollection oc = new OidCollection();
|
||||||
|
oc.Add(new Oid("1.3.6.1.5.5.7.3.1"));
|
||||||
|
X509Extension eku = new X509EnhancedKeyUsageExtension(oc, true);
|
||||||
|
param.Extensions.Add(eku);
|
||||||
|
|
||||||
|
return key.CreateSelfSignedCertificate(param);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*public static X509Certificate2 getCert(string subject)
|
||||||
|
{
|
||||||
|
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
|
||||||
|
|
||||||
|
Mono.Security.Authenticode.PrivateKey key = new Mono.Security.Authenticode.PrivateKey { RSA=RSA.Create()};
|
||||||
|
|
||||||
|
|
||||||
|
Mono.Security.X509.X509CertificateBuilder x509 = new Mono.Security.X509.X509CertificateBuilder();
|
||||||
|
x509.IssuerName = "CN=Vocaluxe Server";
|
||||||
|
x509.NotAfter = DateTime.Today.AddYears(20);
|
||||||
|
x509.NotBefore = DateTime.Today.AddDays(-1);
|
||||||
|
x509.SubjectName = subject;
|
||||||
|
x509.SerialNumber = new byte[] { 1 };
|
||||||
|
x509.Version = 3;
|
||||||
|
x509.SubjectPublicKey = rsa;
|
||||||
|
|
||||||
|
ExtendedKeyUsageExtension eku = new ExtendedKeyUsageExtension();
|
||||||
|
eku.KeyPurpose.Add("1.3.6.1.5.5.7.3.1");
|
||||||
|
x509.Extensions.Add(eku);
|
||||||
|
|
||||||
|
return new X509Certificate2(x509.Sign(rsa));
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{EC28CFA6-35A8-4971-AB07-37A54E010F69}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>ConfigHttpApi</RootNamespace>
|
||||||
|
<AssemblyName>ConfigHttpApi</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<TargetFrameworkProfile />
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<StartupObject />
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Security">
|
||||||
|
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 11.0\Libs\clrsecurity_june10\Security.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Security.Cryptography">
|
||||||
|
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 11.0\Libs\clrsecurity_june10\Security.Cryptography.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="ConfigHttpApi.cs" />
|
||||||
|
<Compile Include="HttpApi.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,643 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Security.Cryptography.X509Certificates;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace ConfigHttpApi
|
||||||
|
{
|
||||||
|
internal static class HttpApi
|
||||||
|
{
|
||||||
|
private static readonly HTTPAPI_VERSION HttpApiVersion = new HTTPAPI_VERSION(1, 0);
|
||||||
|
|
||||||
|
#region DllImport
|
||||||
|
|
||||||
|
[DllImport("httpapi.dll", SetLastError = true)]
|
||||||
|
static extern uint HttpInitialize(
|
||||||
|
HTTPAPI_VERSION version,
|
||||||
|
uint flags,
|
||||||
|
IntPtr pReserved);
|
||||||
|
|
||||||
|
[DllImport("httpapi.dll", SetLastError = true)]
|
||||||
|
static extern uint HttpSetServiceConfiguration(
|
||||||
|
IntPtr serviceIntPtr,
|
||||||
|
HTTP_SERVICE_CONFIG_ID configId,
|
||||||
|
IntPtr pConfigInformation,
|
||||||
|
int configInformationLength,
|
||||||
|
IntPtr pOverlapped);
|
||||||
|
|
||||||
|
[DllImport("httpapi.dll", SetLastError = true)]
|
||||||
|
static extern uint HttpDeleteServiceConfiguration(
|
||||||
|
IntPtr serviceIntPtr,
|
||||||
|
HTTP_SERVICE_CONFIG_ID configId,
|
||||||
|
IntPtr pConfigInformation,
|
||||||
|
int configInformationLength,
|
||||||
|
IntPtr pOverlapped);
|
||||||
|
|
||||||
|
[DllImport("httpapi.dll", SetLastError = true)]
|
||||||
|
static extern uint HttpTerminate(
|
||||||
|
uint Flags,
|
||||||
|
IntPtr pReserved);
|
||||||
|
|
||||||
|
[DllImport("httpapi.dll", SetLastError = true)]
|
||||||
|
static extern uint HttpQueryServiceConfiguration(
|
||||||
|
IntPtr serviceIntPtr,
|
||||||
|
HTTP_SERVICE_CONFIG_ID configId,
|
||||||
|
IntPtr pInputConfigInfo,
|
||||||
|
int inputConfigInfoLength,
|
||||||
|
IntPtr pOutputConfigInfo,
|
||||||
|
int outputConfigInfoLength,
|
||||||
|
[Optional]
|
||||||
|
out int pReturnLength,
|
||||||
|
IntPtr pOverlapped);
|
||||||
|
|
||||||
|
|
||||||
|
enum HTTP_SERVICE_CONFIG_ID
|
||||||
|
{
|
||||||
|
|
||||||
|
HttpServiceConfigIPListenList = 0,
|
||||||
|
HttpServiceConfigSSLCertInfo,
|
||||||
|
HttpServiceConfigUrlAclInfo,
|
||||||
|
HttpServiceConfigMax
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
struct HTTP_SERVICE_CONFIG_SSL_SET
|
||||||
|
{
|
||||||
|
public HTTP_SERVICE_CONFIG_SSL_KEY KeyDesc;
|
||||||
|
public HTTP_SERVICE_CONFIG_SSL_PARAM ParamDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
struct HTTP_SERVICE_CONFIG_SSL_KEY
|
||||||
|
{
|
||||||
|
public IntPtr pIpPort;
|
||||||
|
|
||||||
|
public HTTP_SERVICE_CONFIG_SSL_KEY(IntPtr pIpPort)
|
||||||
|
{
|
||||||
|
this.pIpPort = pIpPort;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
||||||
|
struct HTTP_SERVICE_CONFIG_SSL_PARAM
|
||||||
|
{
|
||||||
|
public int SslHashLength;
|
||||||
|
public IntPtr pSslHash;
|
||||||
|
public Guid AppId;
|
||||||
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string pSslCertStoreName;
|
||||||
|
public uint DefaultCertCheckMode;
|
||||||
|
public int DefaultRevocationFreshnessTime;
|
||||||
|
public int DefaultRevocationUrlRetrievalTimeout;
|
||||||
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string pDefaultSslCtlIdentifier;
|
||||||
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string pDefaultSslCtlStoreName;
|
||||||
|
public uint DefaultFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, Pack = 2)]
|
||||||
|
struct HTTPAPI_VERSION
|
||||||
|
{
|
||||||
|
public ushort HttpApiMajorVersion;
|
||||||
|
public ushort HttpApiMinorVersion;
|
||||||
|
|
||||||
|
public HTTPAPI_VERSION(ushort majorVersion, ushort minorVersion)
|
||||||
|
{
|
||||||
|
HttpApiMajorVersion = majorVersion;
|
||||||
|
HttpApiMinorVersion = minorVersion;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
struct HTTP_SERVICE_CONFIG_SSL_QUERY
|
||||||
|
{
|
||||||
|
public HTTP_SERVICE_CONFIG_QUERY_TYPE QueryDesc;
|
||||||
|
public HTTP_SERVICE_CONFIG_SSL_KEY KeyDesc;
|
||||||
|
public uint dwToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum HTTP_SERVICE_CONFIG_QUERY_TYPE
|
||||||
|
{
|
||||||
|
HttpServiceConfigQueryExact = 0,
|
||||||
|
HttpServiceConfigQueryNext,
|
||||||
|
HttpServiceConfigQueryMax
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
struct HTTP_SERVICE_CONFIG_URLACL_SET
|
||||||
|
{
|
||||||
|
public HTTP_SERVICE_CONFIG_URLACL_KEY KeyDesc;
|
||||||
|
public HTTP_SERVICE_CONFIG_URLACL_PARAM ParamDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
||||||
|
public struct HTTP_SERVICE_CONFIG_URLACL_KEY
|
||||||
|
{
|
||||||
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string pUrlPrefix;
|
||||||
|
|
||||||
|
public HTTP_SERVICE_CONFIG_URLACL_KEY(string urlPrefix)
|
||||||
|
{
|
||||||
|
pUrlPrefix = urlPrefix;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
||||||
|
struct HTTP_SERVICE_CONFIG_URLACL_PARAM
|
||||||
|
{
|
||||||
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string pStringSecurityDescriptor;
|
||||||
|
|
||||||
|
public HTTP_SERVICE_CONFIG_URLACL_PARAM(string securityDescriptor)
|
||||||
|
{
|
||||||
|
pStringSecurityDescriptor = securityDescriptor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Constants
|
||||||
|
|
||||||
|
public const uint HTTP_INITIALIZE_CONFIG = 0x00000002;
|
||||||
|
public const uint HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT = 0x00000002;
|
||||||
|
public const uint HTTP_SERVICE_CONFIG_SSL_FLAG_NO_RAW_FILTER = 0x00000004;
|
||||||
|
private const uint NOERROR = 0;
|
||||||
|
private const uint ERROR_INSUFFICIENT_BUFFER = 122;
|
||||||
|
private const uint ERROR_ALREADY_EXISTS = 183;
|
||||||
|
private const uint ERROR_FILE_NOT_FOUND = 2;
|
||||||
|
private const int ERROR_NO_MORE_ITEMS = 259;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Public methods
|
||||||
|
|
||||||
|
public class SslCertificateInfo
|
||||||
|
{
|
||||||
|
public byte[] Hash { get; set; }
|
||||||
|
public Guid AppId { get; set; }
|
||||||
|
public string StoreName { get; set; }
|
||||||
|
public IPEndPoint IpPort { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SslCertificateInfo QuerySslCertificateInfo(IPEndPoint ipPort)
|
||||||
|
{
|
||||||
|
SslCertificateInfo result = null;
|
||||||
|
|
||||||
|
uint retVal;
|
||||||
|
CallHttpApi(delegate
|
||||||
|
{
|
||||||
|
GCHandle sockAddrHandle = CreateSockaddrStructure(ipPort);
|
||||||
|
IntPtr pIpPort = sockAddrHandle.AddrOfPinnedObject();
|
||||||
|
HTTP_SERVICE_CONFIG_SSL_KEY sslKey = new HTTP_SERVICE_CONFIG_SSL_KEY(pIpPort);
|
||||||
|
|
||||||
|
HTTP_SERVICE_CONFIG_SSL_QUERY inputConfigInfoQuery =
|
||||||
|
new HTTP_SERVICE_CONFIG_SSL_QUERY
|
||||||
|
{
|
||||||
|
QueryDesc = HTTP_SERVICE_CONFIG_QUERY_TYPE.HttpServiceConfigQueryExact,
|
||||||
|
KeyDesc = sslKey
|
||||||
|
};
|
||||||
|
|
||||||
|
IntPtr pInputConfigInfo =
|
||||||
|
Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_QUERY)));
|
||||||
|
Marshal.StructureToPtr(inputConfigInfoQuery, pInputConfigInfo, false);
|
||||||
|
|
||||||
|
IntPtr pOutputConfigInfo = IntPtr.Zero;
|
||||||
|
int returnLength = 0;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
HTTP_SERVICE_CONFIG_ID queryType = HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo;
|
||||||
|
int inputConfigInfoSize = Marshal.SizeOf(inputConfigInfoQuery);
|
||||||
|
retVal = HttpQueryServiceConfiguration(IntPtr.Zero,
|
||||||
|
queryType,
|
||||||
|
pInputConfigInfo,
|
||||||
|
inputConfigInfoSize,
|
||||||
|
pOutputConfigInfo,
|
||||||
|
returnLength,
|
||||||
|
out returnLength,
|
||||||
|
IntPtr.Zero);
|
||||||
|
if (retVal == ERROR_FILE_NOT_FOUND)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (ERROR_INSUFFICIENT_BUFFER == retVal) // ERROR_INSUFFICIENT_BUFFER = 122
|
||||||
|
{
|
||||||
|
pOutputConfigInfo = Marshal.AllocCoTaskMem(returnLength);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
retVal = HttpQueryServiceConfiguration(IntPtr.Zero,
|
||||||
|
queryType,
|
||||||
|
pInputConfigInfo,
|
||||||
|
inputConfigInfoSize,
|
||||||
|
pOutputConfigInfo,
|
||||||
|
returnLength,
|
||||||
|
out returnLength,
|
||||||
|
IntPtr.Zero);
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
|
||||||
|
var outputConfigInfo =
|
||||||
|
(HTTP_SERVICE_CONFIG_SSL_SET)
|
||||||
|
Marshal.PtrToStructure(pOutputConfigInfo, typeof(HTTP_SERVICE_CONFIG_SSL_SET));
|
||||||
|
|
||||||
|
byte[] hash = new byte[outputConfigInfo.ParamDesc.SslHashLength];
|
||||||
|
Marshal.Copy(outputConfigInfo.ParamDesc.pSslHash, hash, 0, hash.Length);
|
||||||
|
|
||||||
|
Guid appId = outputConfigInfo.ParamDesc.AppId;
|
||||||
|
string storeName = outputConfigInfo.ParamDesc.pSslCertStoreName;
|
||||||
|
|
||||||
|
result = new SslCertificateInfo { AppId = appId, Hash = hash, StoreName = storeName, IpPort = ipPort };
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Marshal.FreeCoTaskMem(pOutputConfigInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Marshal.FreeCoTaskMem(pInputConfigInfo);
|
||||||
|
if (sockAddrHandle.IsAllocated)
|
||||||
|
sockAddrHandle.Free();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void BindCertificate(IPEndPoint ipPort, byte[] hash, StoreName storeName, Guid appId)
|
||||||
|
{
|
||||||
|
if (ipPort == null) throw new ArgumentNullException("ipPort");
|
||||||
|
if (hash == null) throw new ArgumentNullException("hash");
|
||||||
|
|
||||||
|
CallHttpApi(
|
||||||
|
delegate
|
||||||
|
{
|
||||||
|
HTTP_SERVICE_CONFIG_SSL_SET configSslSet = new HTTP_SERVICE_CONFIG_SSL_SET();
|
||||||
|
|
||||||
|
GCHandle sockAddrHandle = CreateSockaddrStructure(ipPort);
|
||||||
|
IntPtr pIpPort = sockAddrHandle.AddrOfPinnedObject();
|
||||||
|
HTTP_SERVICE_CONFIG_SSL_KEY httpServiceConfigSslKey =
|
||||||
|
new HTTP_SERVICE_CONFIG_SSL_KEY(pIpPort);
|
||||||
|
HTTP_SERVICE_CONFIG_SSL_PARAM configSslParam = new HTTP_SERVICE_CONFIG_SSL_PARAM();
|
||||||
|
|
||||||
|
|
||||||
|
GCHandle handleHash = GCHandle.Alloc(hash, GCHandleType.Pinned);
|
||||||
|
configSslParam.AppId = appId;
|
||||||
|
configSslParam.DefaultCertCheckMode = 0;
|
||||||
|
configSslParam.DefaultFlags = 0; //HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT;
|
||||||
|
configSslParam.DefaultRevocationFreshnessTime = 0;
|
||||||
|
configSslParam.DefaultRevocationUrlRetrievalTimeout = 0;
|
||||||
|
configSslParam.pSslCertStoreName = storeName.ToString();
|
||||||
|
configSslParam.pSslHash = handleHash.AddrOfPinnedObject();
|
||||||
|
configSslParam.SslHashLength = hash.Length;
|
||||||
|
configSslSet.ParamDesc = configSslParam;
|
||||||
|
configSslSet.KeyDesc = httpServiceConfigSslKey;
|
||||||
|
|
||||||
|
IntPtr pInputConfigInfo =
|
||||||
|
Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_SET)));
|
||||||
|
Marshal.StructureToPtr(configSslSet, pInputConfigInfo, false);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
uint retVal = HttpSetServiceConfiguration(IntPtr.Zero,
|
||||||
|
HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo,
|
||||||
|
pInputConfigInfo,
|
||||||
|
Marshal.SizeOf(configSslSet),
|
||||||
|
IntPtr.Zero);
|
||||||
|
|
||||||
|
if (ERROR_ALREADY_EXISTS != retVal)
|
||||||
|
{
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
retVal = HttpDeleteServiceConfiguration(IntPtr.Zero,
|
||||||
|
HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo,
|
||||||
|
pInputConfigInfo,
|
||||||
|
Marshal.SizeOf(configSslSet),
|
||||||
|
IntPtr.Zero);
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
|
||||||
|
retVal = HttpSetServiceConfiguration(IntPtr.Zero,
|
||||||
|
HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo,
|
||||||
|
pInputConfigInfo,
|
||||||
|
Marshal.SizeOf(configSslSet),
|
||||||
|
IntPtr.Zero);
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Marshal.FreeCoTaskMem(pInputConfigInfo);
|
||||||
|
if (handleHash.IsAllocated)
|
||||||
|
handleHash.Free();
|
||||||
|
if (sockAddrHandle.IsAllocated)
|
||||||
|
sockAddrHandle.Free();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DeleteCertificateBinding(params IPEndPoint[] ipPorts)
|
||||||
|
{
|
||||||
|
if (ipPorts == null || ipPorts.Length == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
CallHttpApi(
|
||||||
|
delegate
|
||||||
|
{
|
||||||
|
foreach (var ipPort in ipPorts)
|
||||||
|
{
|
||||||
|
HTTP_SERVICE_CONFIG_SSL_SET configSslSet =
|
||||||
|
new HTTP_SERVICE_CONFIG_SSL_SET();
|
||||||
|
|
||||||
|
GCHandle sockAddrHandle = CreateSockaddrStructure(ipPort);
|
||||||
|
IntPtr pIpPort = sockAddrHandle.AddrOfPinnedObject();
|
||||||
|
HTTP_SERVICE_CONFIG_SSL_KEY httpServiceConfigSslKey =
|
||||||
|
new HTTP_SERVICE_CONFIG_SSL_KEY(pIpPort);
|
||||||
|
configSslSet.KeyDesc = httpServiceConfigSslKey;
|
||||||
|
|
||||||
|
IntPtr pInputConfigInfo =
|
||||||
|
Marshal.AllocCoTaskMem(
|
||||||
|
Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_SET)));
|
||||||
|
Marshal.StructureToPtr(configSslSet, pInputConfigInfo, false);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
uint retVal = HttpDeleteServiceConfiguration(IntPtr.Zero,
|
||||||
|
HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo,
|
||||||
|
pInputConfigInfo,
|
||||||
|
Marshal.SizeOf(configSslSet),
|
||||||
|
IntPtr.Zero);
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Marshal.FreeCoTaskMem(pInputConfigInfo);
|
||||||
|
if (sockAddrHandle.IsAllocated)
|
||||||
|
sockAddrHandle.Free();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SslCertificateInfo[] QuerySslCertificateInfo()
|
||||||
|
{
|
||||||
|
var result = new List<SslCertificateInfo>();
|
||||||
|
|
||||||
|
CallHttpApi(
|
||||||
|
delegate
|
||||||
|
{
|
||||||
|
uint token = 0;
|
||||||
|
|
||||||
|
uint retVal;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
HTTP_SERVICE_CONFIG_SSL_QUERY inputConfigInfoQuery =
|
||||||
|
new HTTP_SERVICE_CONFIG_SSL_QUERY
|
||||||
|
{
|
||||||
|
QueryDesc = HTTP_SERVICE_CONFIG_QUERY_TYPE.HttpServiceConfigQueryNext,
|
||||||
|
dwToken = token,
|
||||||
|
};
|
||||||
|
|
||||||
|
IntPtr pInputConfigInfo =
|
||||||
|
Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_QUERY)));
|
||||||
|
Marshal.StructureToPtr(inputConfigInfoQuery, pInputConfigInfo, false);
|
||||||
|
|
||||||
|
IntPtr pOutputConfigInfo = IntPtr.Zero;
|
||||||
|
int returnLength = 0;
|
||||||
|
|
||||||
|
const HTTP_SERVICE_CONFIG_ID queryType = HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
int inputConfigInfoSize = Marshal.SizeOf(inputConfigInfoQuery);
|
||||||
|
retVal = HttpQueryServiceConfiguration(IntPtr.Zero,
|
||||||
|
queryType,
|
||||||
|
pInputConfigInfo,
|
||||||
|
inputConfigInfoSize,
|
||||||
|
pOutputConfigInfo,
|
||||||
|
returnLength,
|
||||||
|
out returnLength,
|
||||||
|
IntPtr.Zero);
|
||||||
|
if (ERROR_NO_MORE_ITEMS == retVal)
|
||||||
|
break;
|
||||||
|
if (ERROR_INSUFFICIENT_BUFFER == retVal) // ERROR_INSUFFICIENT_BUFFER = 122
|
||||||
|
{
|
||||||
|
pOutputConfigInfo = Marshal.AllocCoTaskMem(returnLength);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
retVal = HttpQueryServiceConfiguration(IntPtr.Zero,
|
||||||
|
queryType,
|
||||||
|
pInputConfigInfo,
|
||||||
|
inputConfigInfoSize,
|
||||||
|
pOutputConfigInfo,
|
||||||
|
returnLength,
|
||||||
|
out returnLength,
|
||||||
|
IntPtr.Zero);
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
|
||||||
|
var outputConfigInfo = (HTTP_SERVICE_CONFIG_SSL_SET)Marshal.PtrToStructure(
|
||||||
|
pOutputConfigInfo, typeof(HTTP_SERVICE_CONFIG_SSL_SET));
|
||||||
|
|
||||||
|
byte[] hash = new byte[outputConfigInfo.ParamDesc.SslHashLength];
|
||||||
|
Marshal.Copy(outputConfigInfo.ParamDesc.pSslHash, hash, 0, hash.Length);
|
||||||
|
|
||||||
|
Guid appId = outputConfigInfo.ParamDesc.AppId;
|
||||||
|
string storeName = outputConfigInfo.ParamDesc.pSslCertStoreName;
|
||||||
|
IPEndPoint ipPort = ReadSockaddrStructure(outputConfigInfo.KeyDesc.pIpPort);
|
||||||
|
|
||||||
|
var resultItem = new SslCertificateInfo
|
||||||
|
{
|
||||||
|
AppId = appId,
|
||||||
|
Hash = hash,
|
||||||
|
StoreName = storeName,
|
||||||
|
IpPort = ipPort
|
||||||
|
};
|
||||||
|
result.Add(resultItem);
|
||||||
|
token++;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Marshal.FreeCoTaskMem(pOutputConfigInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Marshal.FreeCoTaskMem(pInputConfigInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (NOERROR == retVal);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return result.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ReserveURL(string networkURL, string securityDescriptor)
|
||||||
|
{
|
||||||
|
if (String.IsNullOrEmpty(networkURL)) throw new ArgumentNullException("networkURL");
|
||||||
|
if (String.IsNullOrEmpty(securityDescriptor)) throw new ArgumentNullException("securityDescriptor");
|
||||||
|
|
||||||
|
CallHttpApi(
|
||||||
|
delegate
|
||||||
|
{
|
||||||
|
uint retVal = (uint)NOERROR; // NOERROR = 0
|
||||||
|
|
||||||
|
HTTP_SERVICE_CONFIG_URLACL_KEY keyDesc = new HTTP_SERVICE_CONFIG_URLACL_KEY(networkURL);
|
||||||
|
HTTP_SERVICE_CONFIG_URLACL_PARAM paramDesc = new HTTP_SERVICE_CONFIG_URLACL_PARAM(securityDescriptor);
|
||||||
|
|
||||||
|
HTTP_SERVICE_CONFIG_URLACL_SET inputConfigInfoSet = new HTTP_SERVICE_CONFIG_URLACL_SET();
|
||||||
|
inputConfigInfoSet.KeyDesc = keyDesc;
|
||||||
|
inputConfigInfoSet.ParamDesc = paramDesc;
|
||||||
|
|
||||||
|
IntPtr pInputConfigInfo = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_URLACL_SET)));
|
||||||
|
Marshal.StructureToPtr(inputConfigInfoSet, pInputConfigInfo, false);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
retVal = HttpApi.HttpSetServiceConfiguration(IntPtr.Zero,
|
||||||
|
HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo,
|
||||||
|
pInputConfigInfo,
|
||||||
|
Marshal.SizeOf(inputConfigInfoSet),
|
||||||
|
IntPtr.Zero);
|
||||||
|
|
||||||
|
if ((uint)ERROR_ALREADY_EXISTS == retVal) // ERROR_ALREADY_EXISTS = 183
|
||||||
|
{
|
||||||
|
retVal = HttpApi.HttpDeleteServiceConfiguration(IntPtr.Zero,
|
||||||
|
HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo,
|
||||||
|
pInputConfigInfo,
|
||||||
|
Marshal.SizeOf(inputConfigInfoSet),
|
||||||
|
IntPtr.Zero);
|
||||||
|
|
||||||
|
if ((uint)NOERROR == retVal)
|
||||||
|
{
|
||||||
|
retVal = HttpApi.HttpSetServiceConfiguration(IntPtr.Zero,
|
||||||
|
HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo,
|
||||||
|
pInputConfigInfo,
|
||||||
|
Marshal.SizeOf(inputConfigInfoSet),
|
||||||
|
IntPtr.Zero);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Marshal.FreeCoTaskMem(pInputConfigInfo);
|
||||||
|
HttpApi.HttpTerminate(HttpApi.HTTP_INITIALIZE_CONFIG, IntPtr.Zero);
|
||||||
|
}
|
||||||
|
if ((uint)NOERROR != retVal)
|
||||||
|
{
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private static void ThrowWin32ExceptionIfError(uint retVal)
|
||||||
|
{
|
||||||
|
if (NOERROR != retVal)
|
||||||
|
{
|
||||||
|
throw new Win32Exception(Convert.ToInt32(retVal));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void CallHttpApi(Action body)
|
||||||
|
{
|
||||||
|
uint retVal = HttpInitialize(HttpApiVersion, HTTP_INITIALIZE_CONFIG, IntPtr.Zero);
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
body();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
HttpTerminate(HTTP_INITIALIZE_CONFIG, IntPtr.Zero);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates an unmanaged sockaddr structure to pass to a WinAPI function.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ipEndPoint">IP address and port number</param>
|
||||||
|
/// <returns>a handle for the structure. Use the AddrOfPinnedObject Method to get a stable pointer to the object. </returns>
|
||||||
|
/// <remarks>When the handle goes out of scope you must explicitly release it by calling the Free method; otherwise, memory leaks may occur. </remarks>
|
||||||
|
private static GCHandle CreateSockaddrStructure(IPEndPoint ipEndPoint)
|
||||||
|
{
|
||||||
|
SocketAddress socketAddress = ipEndPoint.Serialize();
|
||||||
|
|
||||||
|
// use an array of bytes instead of the sockaddr structure
|
||||||
|
byte[] sockAddrStructureBytes = new byte[socketAddress.Size];
|
||||||
|
GCHandle sockAddrHandle = GCHandle.Alloc(sockAddrStructureBytes, GCHandleType.Pinned);
|
||||||
|
for (int i = 0; i < socketAddress.Size; ++i)
|
||||||
|
{
|
||||||
|
sockAddrStructureBytes[i] = socketAddress[i];
|
||||||
|
}
|
||||||
|
return sockAddrHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reads the unmanaged sockaddr structure returned by a WinAPI function
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="pSockaddrStructure">pointer to the unmanaged sockaddr structure</param>
|
||||||
|
/// <returns>IP address and port number</returns>
|
||||||
|
private static IPEndPoint ReadSockaddrStructure(IntPtr pSockaddrStructure)
|
||||||
|
{
|
||||||
|
short sAddressFamily = Marshal.ReadInt16(pSockaddrStructure);
|
||||||
|
AddressFamily addressFamily = (AddressFamily)sAddressFamily;
|
||||||
|
|
||||||
|
int sockAddrSructureSize;
|
||||||
|
IPEndPoint ipEndPointAny;
|
||||||
|
switch (addressFamily)
|
||||||
|
{
|
||||||
|
case AddressFamily.InterNetwork:
|
||||||
|
// IP v4 address
|
||||||
|
sockAddrSructureSize = 16;
|
||||||
|
ipEndPointAny = new IPEndPoint(IPAddress.Any, 0);
|
||||||
|
break;
|
||||||
|
case AddressFamily.InterNetworkV6:
|
||||||
|
// IP v6 address
|
||||||
|
sockAddrSructureSize = 28;
|
||||||
|
ipEndPointAny = new IPEndPoint(IPAddress.IPv6Any, 0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new ArgumentOutOfRangeException("pSockaddrStructure", "Unknown address family");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// get bytes of the sockadrr structure
|
||||||
|
byte[] sockAddrSructureBytes = new byte[sockAddrSructureSize];
|
||||||
|
Marshal.Copy(pSockaddrStructure, sockAddrSructureBytes, 0, sockAddrSructureSize);
|
||||||
|
|
||||||
|
// create SocketAddress from bytes
|
||||||
|
var socketAddress = new SocketAddress(AddressFamily.Unspecified, sockAddrSructureSize);
|
||||||
|
for (int i = 0; i < sockAddrSructureSize; i++)
|
||||||
|
{
|
||||||
|
socketAddress[i] = sockAddrSructureBytes[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// create IPEndPoint from SocketAddress
|
||||||
|
IPEndPoint result = (IPEndPoint)ipEndPointAny.Create(socketAddress);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// Allgemeine Informationen über eine Assembly werden über die folgenden
|
||||||
|
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
|
||||||
|
// die mit einer Assembly verknüpft sind.
|
||||||
|
[assembly: AssemblyTitle("ConfigHttpApi")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("ConfigHttpApi")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2013")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar
|
||||||
|
// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von
|
||||||
|
// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
|
||||||
|
[assembly: Guid("89f719af-3a0d-4704-be7f-16e5b4e19c02")]
|
||||||
|
|
||||||
|
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
|
||||||
|
//
|
||||||
|
// Hauptversion
|
||||||
|
// Nebenversion
|
||||||
|
// Buildnummer
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
|
||||||
|
// übernehmen, indem Sie "*" eingeben:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||||
+128
-12
@@ -23,6 +23,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GstreamerHelper", "Gstreame
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClientServerLib", "ClientServerLib\ClientServerLib\ClientServerLib.csproj", "{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClientServerLib", "ClientServerLib\ClientServerLib\ClientServerLib.csproj", "{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebserverInitalConfig", "WebserverInitalConfig\WebserverInitalConfig.csproj", "{55F89808-4E79-4FFE-BC13-48258913F5C9}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
DebugLinux|x64 = DebugLinux|x64
|
DebugLinux|x64 = DebugLinux|x64
|
||||||
@@ -100,72 +102,186 @@ Global
|
|||||||
{6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
|
{6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86
|
{6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseWin|x86.Build.0 = ReleaseWin|x86
|
{6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseWin|x86.Build.0 = ReleaseWin|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.Debug|Any CPU.ActiveCfg = DebugWin|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.Debug|Mixed Platforms.ActiveCfg = DebugWin|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.Debug|Mixed Platforms.Build.0 = DebugWin|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.Debug|x64.ActiveCfg = DebugWin|x64
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.Debug|x64.Build.0 = DebugWin|x64
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.Debug|x86.ActiveCfg = DebugWin|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.Debug|x86.Build.0 = DebugWin|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|Any CPU.ActiveCfg = DebugLinux|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|Mixed Platforms.ActiveCfg = DebugLinux|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|Mixed Platforms.Build.0 = DebugLinux|x86
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|x64.ActiveCfg = DebugLinux|x64
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|x64.ActiveCfg = DebugLinux|x64
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|x64.Build.0 = DebugLinux|x64
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|x64.Build.0 = DebugLinux|x64
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|x86.ActiveCfg = DebugLinux|x86
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|x86.ActiveCfg = DebugLinux|x86
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|x86.Build.0 = DebugLinux|x86
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|x86.Build.0 = DebugLinux|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|Any CPU.ActiveCfg = DebugWin|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|Mixed Platforms.ActiveCfg = DebugWin|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|Mixed Platforms.Build.0 = DebugWin|x86
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|x64.ActiveCfg = DebugWin|x64
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|x64.ActiveCfg = DebugWin|x64
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|x64.Build.0 = DebugWin|x64
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|x64.Build.0 = DebugWin|x64
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|x86.ActiveCfg = DebugWin|x86
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|x86.ActiveCfg = DebugWin|x86
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|x86.Build.0 = DebugWin|x86
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|x86.Build.0 = DebugWin|x86
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.InstallerWin|x64.ActiveCfg = InstallerWin|x64
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.Release|Any CPU.ActiveCfg = ReleaseWin|x86
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.InstallerWin|x64.Build.0 = InstallerWin|x64
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.Release|Mixed Platforms.ActiveCfg = ReleaseWin|x86
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.InstallerWin|x86.ActiveCfg = InstallerWin|x86
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.Release|Mixed Platforms.Build.0 = ReleaseWin|x86
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.InstallerWin|x86.Build.0 = InstallerWin|x86
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.Release|x64.ActiveCfg = ReleaseWin|x64
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.Release|x64.Build.0 = ReleaseWin|x64
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.Release|x86.ActiveCfg = ReleaseWin|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.Release|x86.Build.0 = ReleaseWin|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseLinux|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|Mixed Platforms.ActiveCfg = ReleaseLinux|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|Mixed Platforms.Build.0 = ReleaseLinux|x86
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|x64
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|x64
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|x64.Build.0 = ReleaseLinux|x64
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|x64.Build.0 = ReleaseLinux|x64
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|x86.ActiveCfg = ReleaseLinux|x86
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|x86.ActiveCfg = ReleaseLinux|x86
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|x86.Build.0 = ReleaseLinux|x86
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|x86.Build.0 = ReleaseLinux|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|Any CPU.ActiveCfg = ReleaseWin|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|Mixed Platforms.ActiveCfg = ReleaseWin|x86
|
||||||
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|Mixed Platforms.Build.0 = ReleaseWin|x86
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86
|
||||||
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|x86.Build.0 = ReleaseWin|x86
|
{5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|x86.Build.0 = ReleaseWin|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.Debug|Any CPU.ActiveCfg = DebugWin|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.Debug|Mixed Platforms.ActiveCfg = DebugWin|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.Debug|Mixed Platforms.Build.0 = DebugWin|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.Debug|x64.ActiveCfg = DebugWin|x64
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.Debug|x64.Build.0 = DebugWin|x64
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.Debug|x86.ActiveCfg = DebugWin|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.Debug|x86.Build.0 = DebugWin|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|Any CPU.ActiveCfg = DebugLinux|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|Mixed Platforms.ActiveCfg = DebugLinux|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|Mixed Platforms.Build.0 = DebugLinux|x86
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|x64.ActiveCfg = DebugLinux|x64
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|x64.ActiveCfg = DebugLinux|x64
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|x64.Build.0 = DebugLinux|x64
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|x64.Build.0 = DebugLinux|x64
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|x86.ActiveCfg = DebugLinux|x86
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|x86.ActiveCfg = DebugLinux|x86
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|x86.Build.0 = DebugLinux|x86
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|x86.Build.0 = DebugLinux|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|Any CPU.ActiveCfg = DebugWin|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|Mixed Platforms.ActiveCfg = DebugWin|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|Mixed Platforms.Build.0 = DebugWin|x86
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|x64.ActiveCfg = DebugWin|x64
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|x64.ActiveCfg = DebugWin|x64
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|x64.Build.0 = DebugWin|x64
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|x64.Build.0 = DebugWin|x64
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|x86.ActiveCfg = DebugWin|x86
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|x86.ActiveCfg = DebugWin|x86
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|x86.Build.0 = DebugWin|x86
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|x86.Build.0 = DebugWin|x86
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.InstallerWin|x64.ActiveCfg = InstallerWin|x64
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.Release|Any CPU.ActiveCfg = ReleaseWin|x86
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.InstallerWin|x64.Build.0 = InstallerWin|x64
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.Release|Mixed Platforms.ActiveCfg = ReleaseWin|x86
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.InstallerWin|x86.ActiveCfg = InstallerWin|x86
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.Release|Mixed Platforms.Build.0 = ReleaseWin|x86
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.InstallerWin|x86.Build.0 = InstallerWin|x86
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.Release|x64.ActiveCfg = ReleaseWin|x64
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.Release|x64.Build.0 = ReleaseWin|x64
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.Release|x86.ActiveCfg = ReleaseWin|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.Release|x86.Build.0 = ReleaseWin|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseLinux|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|Mixed Platforms.ActiveCfg = ReleaseLinux|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|Mixed Platforms.Build.0 = ReleaseLinux|x86
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|x64
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|x64
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|x64.Build.0 = ReleaseLinux|x64
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|x64.Build.0 = ReleaseLinux|x64
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|x86.ActiveCfg = ReleaseLinux|x86
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|x86.ActiveCfg = ReleaseLinux|x86
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|x86.Build.0 = ReleaseLinux|x86
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|x86.Build.0 = ReleaseLinux|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|Any CPU.ActiveCfg = ReleaseWin|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|Mixed Platforms.ActiveCfg = ReleaseWin|x86
|
||||||
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|Mixed Platforms.Build.0 = ReleaseWin|x86
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86
|
||||||
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|x86.Build.0 = ReleaseWin|x86
|
{6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|x86.Build.0 = ReleaseWin|x86
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.Debug|Any CPU.ActiveCfg = DebugWin|Win32
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.Debug|Mixed Platforms.ActiveCfg = DebugWin|Win32
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.Debug|Mixed Platforms.Build.0 = DebugWin|Win32
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.Debug|x64.ActiveCfg = DebugWin|x64
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.Debug|x64.Build.0 = DebugWin|x64
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.Debug|x86.ActiveCfg = DebugWin|Win32
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.Debug|x86.Build.0 = DebugWin|Win32
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugLinux|Any CPU.ActiveCfg = DebugWin|Win32
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugLinux|Mixed Platforms.ActiveCfg = DebugWin|Win32
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugLinux|Mixed Platforms.Build.0 = DebugWin|Win32
|
||||||
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugLinux|x64.ActiveCfg = DebugWin|x64
|
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugLinux|x64.ActiveCfg = DebugWin|x64
|
||||||
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugLinux|x86.ActiveCfg = DebugWin|x64
|
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugLinux|x86.ActiveCfg = DebugWin|x64
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|Any CPU.ActiveCfg = DebugWin|Win32
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|Mixed Platforms.ActiveCfg = DebugWin|Win32
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|Mixed Platforms.Build.0 = DebugWin|Win32
|
||||||
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|x64.ActiveCfg = DebugWin|x64
|
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|x64.ActiveCfg = DebugWin|x64
|
||||||
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|x64.Build.0 = DebugWin|x64
|
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|x64.Build.0 = DebugWin|x64
|
||||||
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|x86.ActiveCfg = DebugWin|Win32
|
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|x86.ActiveCfg = DebugWin|Win32
|
||||||
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|x86.Build.0 = DebugWin|Win32
|
{ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|x86.Build.0 = DebugWin|Win32
|
||||||
{ED007796-367F-4142-AA55-5450C7645C2C}.InstallerWin|x64.ActiveCfg = InstallerWin|x64
|
{ED007796-367F-4142-AA55-5450C7645C2C}.Release|Any CPU.ActiveCfg = ReleaseWin|Win32
|
||||||
{ED007796-367F-4142-AA55-5450C7645C2C}.InstallerWin|x64.Build.0 = InstallerWin|x64
|
{ED007796-367F-4142-AA55-5450C7645C2C}.Release|Mixed Platforms.ActiveCfg = ReleaseWin|Win32
|
||||||
{ED007796-367F-4142-AA55-5450C7645C2C}.InstallerWin|x86.ActiveCfg = InstallerWin|Win32
|
{ED007796-367F-4142-AA55-5450C7645C2C}.Release|Mixed Platforms.Build.0 = ReleaseWin|Win32
|
||||||
{ED007796-367F-4142-AA55-5450C7645C2C}.InstallerWin|x86.Build.0 = InstallerWin|Win32
|
{ED007796-367F-4142-AA55-5450C7645C2C}.Release|x64.ActiveCfg = ReleaseWin|x64
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.Release|x64.Build.0 = ReleaseWin|x64
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.Release|x86.ActiveCfg = ReleaseWin|Win32
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.Release|x86.Build.0 = ReleaseWin|Win32
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseWin|Win32
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseLinux|Mixed Platforms.ActiveCfg = ReleaseWin|Win32
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseLinux|Mixed Platforms.Build.0 = ReleaseWin|Win32
|
||||||
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseLinux|x64.ActiveCfg = ReleaseWin|x64
|
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseLinux|x64.ActiveCfg = ReleaseWin|x64
|
||||||
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseLinux|x86.ActiveCfg = ReleaseWin|x64
|
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseLinux|x86.ActiveCfg = ReleaseWin|x64
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|Any CPU.ActiveCfg = ReleaseWin|Win32
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|Mixed Platforms.ActiveCfg = ReleaseWin|Win32
|
||||||
|
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|Mixed Platforms.Build.0 = ReleaseWin|Win32
|
||||||
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64
|
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64
|
||||||
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
|
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|x64.Build.0 = ReleaseWin|x64
|
||||||
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|x86.ActiveCfg = ReleaseWin|Win32
|
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|x86.ActiveCfg = ReleaseWin|Win32
|
||||||
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|x86.Build.0 = ReleaseWin|Win32
|
{ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|x86.Build.0 = ReleaseWin|Win32
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|x64.ActiveCfg = Debug|Any CPU
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|x64.ActiveCfg = Debug|Any CPU
|
||||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|x86.ActiveCfg = Debug|Any CPU
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|x64.ActiveCfg = Debug|Any CPU
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|x64.ActiveCfg = Debug|Any CPU
|
||||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|x86.ActiveCfg = Debug|Any CPU
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|x64.ActiveCfg = Release|Any CPU
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|x86.ActiveCfg = Release|Any CPU
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|x64.ActiveCfg = Release|Any CPU
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|x64.ActiveCfg = Release|Any CPU
|
||||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|x86.ActiveCfg = Release|Any CPU
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|x64.ActiveCfg = Release|Any CPU
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|x64.ActiveCfg = Release|Any CPU
|
||||||
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|x86.ActiveCfg = Release|Any CPU
|
{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugLinux|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugLinux|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugLinux|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugLinux|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugLinux|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugWin|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugWin|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugWin|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugWin|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugWin|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugWin|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseLinux|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseLinux|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseLinux|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseWin|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseWin|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseWin|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseWin|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseWin|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseWin|x86.ActiveCfg = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@@ -43,16 +43,9 @@ namespace Vocaluxe.Base.Server
|
|||||||
public static void Init()
|
public static void Init()
|
||||||
{
|
{
|
||||||
_Clients = new Dictionary<int, CClientHandler>();
|
_Clients = new Dictionary<int, CClientHandler>();
|
||||||
if (CConfig.ServerEncryption == EOffOn.TR_CONFIG_ON)
|
|
||||||
{
|
_Server = new CServer(CConfig.ServerPort, CConfig.ServerEncryption == EOffOn.TR_CONFIG_ON);
|
||||||
_Server = new CServer(CConfig.ServerPort);
|
//_Server = new CServer(RequestHandler, CConfig.ServerPort, CConfig.ServerPassword);
|
||||||
//_Server = new CServer(RequestHandler, CConfig.ServerPort, CConfig.ServerPassword);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_Server = new CServer(CConfig.ServerPort);
|
|
||||||
//_Server = new CServer(RequestHandler, CConfig.ServerPort, String.Empty);
|
|
||||||
}
|
|
||||||
|
|
||||||
CServer.SendKeyEvent = sendKeyEvent;
|
CServer.SendKeyEvent = sendKeyEvent;
|
||||||
CServer.GetProfileData = getProfileData;
|
CServer.GetProfileData = getProfileData;
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<configuration>
|
||||||
|
<startup>
|
||||||
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
|
||||||
|
</startup>
|
||||||
|
</configuration>
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
using Security.Cryptography;
|
||||||
|
using Security.Cryptography.X509Certificates;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Security.Cryptography.X509Certificates;
|
||||||
|
using System.Security.Permissions;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace WebserverInitalConfig
|
||||||
|
{
|
||||||
|
public static class ConfigHttpApi
|
||||||
|
{
|
||||||
|
|
||||||
|
public static void reserveURL(string networkString)
|
||||||
|
{
|
||||||
|
HttpApi.ReserveURL(networkString, "D:(A;;GX;;;S-1-1-0)");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void bindCert(string ip, int port, X509Certificate2 cert)
|
||||||
|
{
|
||||||
|
IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(ip), port);
|
||||||
|
if (HttpApi.QuerySslCertificateInfo(endpoint) != null)
|
||||||
|
{
|
||||||
|
HttpApi.DeleteCertificateBinding(endpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpApi.BindCertificate(endpoint, cert.GetCertHash(), StoreName.My, new Guid("{7baf41f1-48b7-42cb-b145-f815499cb48f}"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void addCertToStore(X509Certificate2 cert)
|
||||||
|
{
|
||||||
|
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
|
||||||
|
store.Open(OpenFlags.ReadWrite);
|
||||||
|
|
||||||
|
X509Certificate2Collection oldCerts = store.Certificates.Find(X509FindType.FindBySubjectDistinguishedName,
|
||||||
|
cert.SubjectName.Name, false);
|
||||||
|
|
||||||
|
foreach (var oldCert in oldCerts)
|
||||||
|
{
|
||||||
|
store.Remove(oldCert);
|
||||||
|
}
|
||||||
|
|
||||||
|
store.Add(cert);
|
||||||
|
store.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static X509Certificate2 getSelfSignedCert(string subjectName)
|
||||||
|
{
|
||||||
|
var keyParam = new CngKeyCreationParameters
|
||||||
|
{
|
||||||
|
ExportPolicy = CngExportPolicies.AllowExport,
|
||||||
|
KeyCreationOptions = CngKeyCreationOptions.MachineKey | CngKeyCreationOptions.OverwriteExistingKey,
|
||||||
|
KeyUsage = CngKeyUsages.AllUsages,
|
||||||
|
Provider = CngProvider.MicrosoftSoftwareKeyStorageProvider,
|
||||||
|
};
|
||||||
|
|
||||||
|
keyParam.Parameters.Add(new CngProperty("Length", BitConverter.GetBytes(2048), CngPropertyOptions.None));
|
||||||
|
|
||||||
|
CngKey key = CngKey.Create(CngAlgorithm2.Rsa, Guid.NewGuid().ToString(), keyParam);
|
||||||
|
|
||||||
|
X509CertificateCreationParameters param = new X509CertificateCreationParameters(
|
||||||
|
new X500DistinguishedName(subjectName));
|
||||||
|
param.SubjectName = new X500DistinguishedName(subjectName);
|
||||||
|
param.EndTime = DateTime.Today.AddYears(20);
|
||||||
|
//param.SignatureAlgorithm = X509CertificateSignatureAlgorithm.RsaSha512;
|
||||||
|
|
||||||
|
OidCollection oc = new OidCollection();
|
||||||
|
oc.Add(new Oid("1.3.6.1.5.5.7.3.1"));
|
||||||
|
X509Extension eku = new X509EnhancedKeyUsageExtension(oc, true);
|
||||||
|
param.Extensions.Add(eku);
|
||||||
|
|
||||||
|
param.TakeOwnershipOfKey = true;
|
||||||
|
|
||||||
|
byte[] rawData = key.CreateSelfSignedCertificate(param).Export(X509ContentType.Pfx, "");
|
||||||
|
var cert = new X509Certificate2(rawData, "", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
|
||||||
|
cert.FriendlyName = "Vocaluxe Server Certificate";
|
||||||
|
return cert;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*public static X509Certificate2 getCert(string subject)
|
||||||
|
{
|
||||||
|
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
|
||||||
|
|
||||||
|
Mono.Security.Authenticode.PrivateKey key = new Mono.Security.Authenticode.PrivateKey { RSA=RSA.Create()};
|
||||||
|
|
||||||
|
|
||||||
|
Mono.Security.X509.X509CertificateBuilder x509 = new Mono.Security.X509.X509CertificateBuilder();
|
||||||
|
x509.IssuerName = "CN=Vocaluxe Server";
|
||||||
|
x509.NotAfter = DateTime.Today.AddYears(20);
|
||||||
|
x509.NotBefore = DateTime.Today.AddDays(-1);
|
||||||
|
x509.SubjectName = subject;
|
||||||
|
x509.SerialNumber = new byte[] { 1 };
|
||||||
|
x509.Version = 3;
|
||||||
|
x509.SubjectPublicKey = rsa;
|
||||||
|
|
||||||
|
ExtendedKeyUsageExtension eku = new ExtendedKeyUsageExtension();
|
||||||
|
eku.KeyPurpose.Add("1.3.6.1.5.5.7.3.1");
|
||||||
|
x509.Extensions.Add(eku);
|
||||||
|
|
||||||
|
return new X509Certificate2(x509.Sign(rsa));
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,672 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Security.Cryptography.X509Certificates;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace WebserverInitalConfig
|
||||||
|
{
|
||||||
|
internal static class HttpApi
|
||||||
|
{
|
||||||
|
private static readonly HTTPAPI_VERSION HttpApiVersion = new HTTPAPI_VERSION(1, 0);
|
||||||
|
|
||||||
|
#region DllImport
|
||||||
|
|
||||||
|
[DllImport("httpapi.dll", SetLastError = true)]
|
||||||
|
static extern uint HttpInitialize(
|
||||||
|
HTTPAPI_VERSION version,
|
||||||
|
uint flags,
|
||||||
|
IntPtr pReserved);
|
||||||
|
|
||||||
|
[DllImport("httpapi.dll", SetLastError = true)]
|
||||||
|
static extern uint HttpSetServiceConfiguration(
|
||||||
|
IntPtr serviceIntPtr,
|
||||||
|
HTTP_SERVICE_CONFIG_ID configId,
|
||||||
|
IntPtr pConfigInformation,
|
||||||
|
int configInformationLength,
|
||||||
|
IntPtr pOverlapped);
|
||||||
|
|
||||||
|
[DllImport("httpapi.dll", SetLastError = true)]
|
||||||
|
static extern uint HttpDeleteServiceConfiguration(
|
||||||
|
IntPtr serviceIntPtr,
|
||||||
|
HTTP_SERVICE_CONFIG_ID configId,
|
||||||
|
IntPtr pConfigInformation,
|
||||||
|
int configInformationLength,
|
||||||
|
IntPtr pOverlapped);
|
||||||
|
|
||||||
|
[DllImport("httpapi.dll", SetLastError = true)]
|
||||||
|
static extern uint HttpTerminate(
|
||||||
|
uint Flags,
|
||||||
|
IntPtr pReserved);
|
||||||
|
|
||||||
|
[DllImport("httpapi.dll", SetLastError = true)]
|
||||||
|
static extern uint HttpQueryServiceConfiguration(
|
||||||
|
IntPtr serviceIntPtr,
|
||||||
|
HTTP_SERVICE_CONFIG_ID configId,
|
||||||
|
IntPtr pInputConfigInfo,
|
||||||
|
int inputConfigInfoLength,
|
||||||
|
IntPtr pOutputConfigInfo,
|
||||||
|
int outputConfigInfoLength,
|
||||||
|
[Optional]
|
||||||
|
out int pReturnLength,
|
||||||
|
IntPtr pOverlapped);
|
||||||
|
|
||||||
|
|
||||||
|
enum HTTP_SERVICE_CONFIG_ID
|
||||||
|
{
|
||||||
|
|
||||||
|
HttpServiceConfigIPListenList = 0,
|
||||||
|
HttpServiceConfigSSLCertInfo,
|
||||||
|
HttpServiceConfigUrlAclInfo,
|
||||||
|
HttpServiceConfigMax
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
struct HTTP_SERVICE_CONFIG_SSL_SET
|
||||||
|
{
|
||||||
|
public HTTP_SERVICE_CONFIG_SSL_KEY KeyDesc;
|
||||||
|
public HTTP_SERVICE_CONFIG_SSL_PARAM ParamDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
struct HTTP_SERVICE_CONFIG_SSL_KEY
|
||||||
|
{
|
||||||
|
public IntPtr pIpPort;
|
||||||
|
|
||||||
|
public HTTP_SERVICE_CONFIG_SSL_KEY(IntPtr pIpPort)
|
||||||
|
{
|
||||||
|
this.pIpPort = pIpPort;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
||||||
|
struct HTTP_SERVICE_CONFIG_SSL_PARAM
|
||||||
|
{
|
||||||
|
public int SslHashLength;
|
||||||
|
public IntPtr pSslHash;
|
||||||
|
public Guid AppId;
|
||||||
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string pSslCertStoreName;
|
||||||
|
public uint DefaultCertCheckMode;
|
||||||
|
public int DefaultRevocationFreshnessTime;
|
||||||
|
public int DefaultRevocationUrlRetrievalTimeout;
|
||||||
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string pDefaultSslCtlIdentifier;
|
||||||
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string pDefaultSslCtlStoreName;
|
||||||
|
public uint DefaultFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, Pack = 2)]
|
||||||
|
struct HTTPAPI_VERSION
|
||||||
|
{
|
||||||
|
public ushort HttpApiMajorVersion;
|
||||||
|
public ushort HttpApiMinorVersion;
|
||||||
|
|
||||||
|
public HTTPAPI_VERSION(ushort majorVersion, ushort minorVersion)
|
||||||
|
{
|
||||||
|
HttpApiMajorVersion = majorVersion;
|
||||||
|
HttpApiMinorVersion = minorVersion;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
struct HTTP_SERVICE_CONFIG_SSL_QUERY
|
||||||
|
{
|
||||||
|
public HTTP_SERVICE_CONFIG_QUERY_TYPE QueryDesc;
|
||||||
|
public HTTP_SERVICE_CONFIG_SSL_KEY KeyDesc;
|
||||||
|
public uint dwToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum HTTP_SERVICE_CONFIG_QUERY_TYPE
|
||||||
|
{
|
||||||
|
HttpServiceConfigQueryExact = 0,
|
||||||
|
HttpServiceConfigQueryNext,
|
||||||
|
HttpServiceConfigQueryMax
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
|
struct HTTP_SERVICE_CONFIG_URLACL_SET
|
||||||
|
{
|
||||||
|
public HTTP_SERVICE_CONFIG_URLACL_KEY KeyDesc;
|
||||||
|
public HTTP_SERVICE_CONFIG_URLACL_PARAM ParamDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
||||||
|
public struct HTTP_SERVICE_CONFIG_URLACL_KEY
|
||||||
|
{
|
||||||
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string pUrlPrefix;
|
||||||
|
|
||||||
|
public HTTP_SERVICE_CONFIG_URLACL_KEY(string urlPrefix)
|
||||||
|
{
|
||||||
|
pUrlPrefix = urlPrefix;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
||||||
|
struct HTTP_SERVICE_CONFIG_URLACL_PARAM
|
||||||
|
{
|
||||||
|
[MarshalAs(UnmanagedType.LPWStr)]
|
||||||
|
public string pStringSecurityDescriptor;
|
||||||
|
|
||||||
|
public HTTP_SERVICE_CONFIG_URLACL_PARAM(string securityDescriptor)
|
||||||
|
{
|
||||||
|
pStringSecurityDescriptor = securityDescriptor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Constants
|
||||||
|
|
||||||
|
public const uint HTTP_INITIALIZE_CONFIG = 0x00000002;
|
||||||
|
public const uint HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT = 0x00000002;
|
||||||
|
public const uint HTTP_SERVICE_CONFIG_SSL_FLAG_NO_RAW_FILTER = 0x00000004;
|
||||||
|
private const uint NOERROR = 0;
|
||||||
|
private const uint ERROR_INSUFFICIENT_BUFFER = 122;
|
||||||
|
private const uint ERROR_ALREADY_EXISTS = 183;
|
||||||
|
private const uint ERROR_FILE_NOT_FOUND = 2;
|
||||||
|
private const int ERROR_NO_MORE_ITEMS = 259;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Public methods
|
||||||
|
|
||||||
|
public class SslCertificateInfo
|
||||||
|
{
|
||||||
|
public byte[] Hash { get; set; }
|
||||||
|
public Guid AppId { get; set; }
|
||||||
|
public string StoreName { get; set; }
|
||||||
|
public IPEndPoint IpPort { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SslCertificateInfo QuerySslCertificateInfo(IPEndPoint ipPort)
|
||||||
|
{
|
||||||
|
SslCertificateInfo result = null;
|
||||||
|
|
||||||
|
uint retVal;
|
||||||
|
CallHttpApi(delegate
|
||||||
|
{
|
||||||
|
GCHandle sockAddrHandle = CreateSockaddrStructure(ipPort);
|
||||||
|
IntPtr pIpPort = sockAddrHandle.AddrOfPinnedObject();
|
||||||
|
HTTP_SERVICE_CONFIG_SSL_KEY sslKey = new HTTP_SERVICE_CONFIG_SSL_KEY(pIpPort);
|
||||||
|
|
||||||
|
HTTP_SERVICE_CONFIG_SSL_QUERY inputConfigInfoQuery =
|
||||||
|
new HTTP_SERVICE_CONFIG_SSL_QUERY
|
||||||
|
{
|
||||||
|
QueryDesc = HTTP_SERVICE_CONFIG_QUERY_TYPE.HttpServiceConfigQueryExact,
|
||||||
|
KeyDesc = sslKey
|
||||||
|
};
|
||||||
|
|
||||||
|
IntPtr pInputConfigInfo =
|
||||||
|
Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_QUERY)));
|
||||||
|
Marshal.StructureToPtr(inputConfigInfoQuery, pInputConfigInfo, false);
|
||||||
|
|
||||||
|
IntPtr pOutputConfigInfo = IntPtr.Zero;
|
||||||
|
int returnLength = 0;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
HTTP_SERVICE_CONFIG_ID queryType = HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo;
|
||||||
|
int inputConfigInfoSize = Marshal.SizeOf(inputConfigInfoQuery);
|
||||||
|
retVal = HttpQueryServiceConfiguration(IntPtr.Zero,
|
||||||
|
queryType,
|
||||||
|
pInputConfigInfo,
|
||||||
|
inputConfigInfoSize,
|
||||||
|
pOutputConfigInfo,
|
||||||
|
returnLength,
|
||||||
|
out returnLength,
|
||||||
|
IntPtr.Zero);
|
||||||
|
if (retVal == ERROR_FILE_NOT_FOUND)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (ERROR_INSUFFICIENT_BUFFER == retVal) // ERROR_INSUFFICIENT_BUFFER = 122
|
||||||
|
{
|
||||||
|
pOutputConfigInfo = Marshal.AllocCoTaskMem(returnLength);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
retVal = HttpQueryServiceConfiguration(IntPtr.Zero,
|
||||||
|
queryType,
|
||||||
|
pInputConfigInfo,
|
||||||
|
inputConfigInfoSize,
|
||||||
|
pOutputConfigInfo,
|
||||||
|
returnLength,
|
||||||
|
out returnLength,
|
||||||
|
IntPtr.Zero);
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
|
||||||
|
var outputConfigInfo =
|
||||||
|
(HTTP_SERVICE_CONFIG_SSL_SET)
|
||||||
|
Marshal.PtrToStructure(pOutputConfigInfo, typeof(HTTP_SERVICE_CONFIG_SSL_SET));
|
||||||
|
|
||||||
|
byte[] hash = new byte[outputConfigInfo.ParamDesc.SslHashLength];
|
||||||
|
Marshal.Copy(outputConfigInfo.ParamDesc.pSslHash, hash, 0, hash.Length);
|
||||||
|
|
||||||
|
Guid appId = outputConfigInfo.ParamDesc.AppId;
|
||||||
|
string storeName = outputConfigInfo.ParamDesc.pSslCertStoreName;
|
||||||
|
|
||||||
|
result = new SslCertificateInfo { AppId = appId, Hash = hash, StoreName = storeName, IpPort = ipPort };
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Marshal.FreeCoTaskMem(pOutputConfigInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Marshal.FreeCoTaskMem(pInputConfigInfo);
|
||||||
|
if (sockAddrHandle.IsAllocated)
|
||||||
|
sockAddrHandle.Free();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void BindCertificate(IPEndPoint ipPort, byte[] hash, StoreName storeName, Guid appId)
|
||||||
|
{
|
||||||
|
if (ipPort == null) throw new ArgumentNullException("ipPort");
|
||||||
|
if (hash == null) throw new ArgumentNullException("hash");
|
||||||
|
|
||||||
|
CallHttpApi(
|
||||||
|
delegate
|
||||||
|
{
|
||||||
|
HTTP_SERVICE_CONFIG_SSL_SET configSslSet = new HTTP_SERVICE_CONFIG_SSL_SET();
|
||||||
|
|
||||||
|
GCHandle sockAddrHandle = CreateSockaddrStructure(ipPort);
|
||||||
|
IntPtr pIpPort = sockAddrHandle.AddrOfPinnedObject();
|
||||||
|
HTTP_SERVICE_CONFIG_SSL_KEY httpServiceConfigSslKey =
|
||||||
|
new HTTP_SERVICE_CONFIG_SSL_KEY(pIpPort);
|
||||||
|
HTTP_SERVICE_CONFIG_SSL_PARAM configSslParam = new HTTP_SERVICE_CONFIG_SSL_PARAM();
|
||||||
|
|
||||||
|
|
||||||
|
GCHandle handleHash = GCHandle.Alloc(hash, GCHandleType.Pinned);
|
||||||
|
configSslParam.AppId = appId;
|
||||||
|
configSslParam.DefaultCertCheckMode = 0;
|
||||||
|
configSslParam.DefaultFlags = 0; //HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT;
|
||||||
|
configSslParam.DefaultRevocationFreshnessTime = 0;
|
||||||
|
configSslParam.DefaultRevocationUrlRetrievalTimeout = 0;
|
||||||
|
configSslParam.pSslCertStoreName = storeName.ToString();
|
||||||
|
configSslParam.pSslHash = handleHash.AddrOfPinnedObject();
|
||||||
|
configSslParam.SslHashLength = hash.Length;
|
||||||
|
configSslSet.ParamDesc = configSslParam;
|
||||||
|
configSslSet.KeyDesc = httpServiceConfigSslKey;
|
||||||
|
|
||||||
|
IntPtr pInputConfigInfo =
|
||||||
|
Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_SET)));
|
||||||
|
Marshal.StructureToPtr(configSslSet, pInputConfigInfo, false);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
uint retVal = HttpSetServiceConfiguration(IntPtr.Zero,
|
||||||
|
HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo,
|
||||||
|
pInputConfigInfo,
|
||||||
|
Marshal.SizeOf(configSslSet),
|
||||||
|
IntPtr.Zero);
|
||||||
|
|
||||||
|
if (ERROR_ALREADY_EXISTS != retVal)
|
||||||
|
{
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
retVal = HttpDeleteServiceConfiguration(IntPtr.Zero,
|
||||||
|
HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo,
|
||||||
|
pInputConfigInfo,
|
||||||
|
Marshal.SizeOf(configSslSet),
|
||||||
|
IntPtr.Zero);
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
|
||||||
|
retVal = HttpSetServiceConfiguration(IntPtr.Zero,
|
||||||
|
HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo,
|
||||||
|
pInputConfigInfo,
|
||||||
|
Marshal.SizeOf(configSslSet),
|
||||||
|
IntPtr.Zero);
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Marshal.FreeCoTaskMem(pInputConfigInfo);
|
||||||
|
if (handleHash.IsAllocated)
|
||||||
|
handleHash.Free();
|
||||||
|
if (sockAddrHandle.IsAllocated)
|
||||||
|
sockAddrHandle.Free();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DeleteCertificateBinding(params IPEndPoint[] ipPorts)
|
||||||
|
{
|
||||||
|
if (ipPorts == null || ipPorts.Length == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
CallHttpApi(
|
||||||
|
delegate
|
||||||
|
{
|
||||||
|
foreach (var ipPort in ipPorts)
|
||||||
|
{
|
||||||
|
HTTP_SERVICE_CONFIG_SSL_SET configSslSet =
|
||||||
|
new HTTP_SERVICE_CONFIG_SSL_SET();
|
||||||
|
|
||||||
|
GCHandle sockAddrHandle = CreateSockaddrStructure(ipPort);
|
||||||
|
IntPtr pIpPort = sockAddrHandle.AddrOfPinnedObject();
|
||||||
|
HTTP_SERVICE_CONFIG_SSL_KEY httpServiceConfigSslKey =
|
||||||
|
new HTTP_SERVICE_CONFIG_SSL_KEY(pIpPort);
|
||||||
|
configSslSet.KeyDesc = httpServiceConfigSslKey;
|
||||||
|
|
||||||
|
IntPtr pInputConfigInfo =
|
||||||
|
Marshal.AllocCoTaskMem(
|
||||||
|
Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_SET)));
|
||||||
|
Marshal.StructureToPtr(configSslSet, pInputConfigInfo, false);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
uint retVal = HttpDeleteServiceConfiguration(IntPtr.Zero,
|
||||||
|
HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo,
|
||||||
|
pInputConfigInfo,
|
||||||
|
Marshal.SizeOf(configSslSet),
|
||||||
|
IntPtr.Zero);
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Marshal.FreeCoTaskMem(pInputConfigInfo);
|
||||||
|
if (sockAddrHandle.IsAllocated)
|
||||||
|
sockAddrHandle.Free();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SslCertificateInfo[] QuerySslCertificateInfo()
|
||||||
|
{
|
||||||
|
var result = new List<SslCertificateInfo>();
|
||||||
|
|
||||||
|
CallHttpApi(
|
||||||
|
delegate
|
||||||
|
{
|
||||||
|
uint token = 0;
|
||||||
|
|
||||||
|
uint retVal;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
HTTP_SERVICE_CONFIG_SSL_QUERY inputConfigInfoQuery =
|
||||||
|
new HTTP_SERVICE_CONFIG_SSL_QUERY
|
||||||
|
{
|
||||||
|
QueryDesc = HTTP_SERVICE_CONFIG_QUERY_TYPE.HttpServiceConfigQueryNext,
|
||||||
|
dwToken = token,
|
||||||
|
};
|
||||||
|
|
||||||
|
IntPtr pInputConfigInfo =
|
||||||
|
Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_QUERY)));
|
||||||
|
Marshal.StructureToPtr(inputConfigInfoQuery, pInputConfigInfo, false);
|
||||||
|
|
||||||
|
IntPtr pOutputConfigInfo = IntPtr.Zero;
|
||||||
|
int returnLength = 0;
|
||||||
|
|
||||||
|
const HTTP_SERVICE_CONFIG_ID queryType = HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
int inputConfigInfoSize = Marshal.SizeOf(inputConfigInfoQuery);
|
||||||
|
retVal = HttpQueryServiceConfiguration(IntPtr.Zero,
|
||||||
|
queryType,
|
||||||
|
pInputConfigInfo,
|
||||||
|
inputConfigInfoSize,
|
||||||
|
pOutputConfigInfo,
|
||||||
|
returnLength,
|
||||||
|
out returnLength,
|
||||||
|
IntPtr.Zero);
|
||||||
|
if (ERROR_NO_MORE_ITEMS == retVal)
|
||||||
|
break;
|
||||||
|
if (ERROR_INSUFFICIENT_BUFFER == retVal) // ERROR_INSUFFICIENT_BUFFER = 122
|
||||||
|
{
|
||||||
|
pOutputConfigInfo = Marshal.AllocCoTaskMem(returnLength);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
retVal = HttpQueryServiceConfiguration(IntPtr.Zero,
|
||||||
|
queryType,
|
||||||
|
pInputConfigInfo,
|
||||||
|
inputConfigInfoSize,
|
||||||
|
pOutputConfigInfo,
|
||||||
|
returnLength,
|
||||||
|
out returnLength,
|
||||||
|
IntPtr.Zero);
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
|
||||||
|
var outputConfigInfo = (HTTP_SERVICE_CONFIG_SSL_SET)Marshal.PtrToStructure(
|
||||||
|
pOutputConfigInfo, typeof(HTTP_SERVICE_CONFIG_SSL_SET));
|
||||||
|
|
||||||
|
byte[] hash = new byte[outputConfigInfo.ParamDesc.SslHashLength];
|
||||||
|
Marshal.Copy(outputConfigInfo.ParamDesc.pSslHash, hash, 0, hash.Length);
|
||||||
|
|
||||||
|
Guid appId = outputConfigInfo.ParamDesc.AppId;
|
||||||
|
string storeName = outputConfigInfo.ParamDesc.pSslCertStoreName;
|
||||||
|
IPEndPoint ipPort = ReadSockaddrStructure(outputConfigInfo.KeyDesc.pIpPort);
|
||||||
|
|
||||||
|
var resultItem = new SslCertificateInfo
|
||||||
|
{
|
||||||
|
AppId = appId,
|
||||||
|
Hash = hash,
|
||||||
|
StoreName = storeName,
|
||||||
|
IpPort = ipPort
|
||||||
|
};
|
||||||
|
result.Add(resultItem);
|
||||||
|
token++;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Marshal.FreeCoTaskMem(pOutputConfigInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Marshal.FreeCoTaskMem(pInputConfigInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (NOERROR == retVal);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return result.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ReserveURL(string networkURL, string securityDescriptor)
|
||||||
|
{
|
||||||
|
if (String.IsNullOrEmpty(networkURL)) throw new ArgumentNullException("networkURL");
|
||||||
|
if (String.IsNullOrEmpty(securityDescriptor)) throw new ArgumentNullException("securityDescriptor");
|
||||||
|
|
||||||
|
CallHttpApi(
|
||||||
|
delegate
|
||||||
|
{
|
||||||
|
uint retVal = (uint)NOERROR; // NOERROR = 0
|
||||||
|
|
||||||
|
HTTP_SERVICE_CONFIG_URLACL_KEY keyDesc = new HTTP_SERVICE_CONFIG_URLACL_KEY(networkURL);
|
||||||
|
HTTP_SERVICE_CONFIG_URLACL_PARAM paramDesc = new HTTP_SERVICE_CONFIG_URLACL_PARAM(securityDescriptor);
|
||||||
|
|
||||||
|
HTTP_SERVICE_CONFIG_URLACL_SET inputConfigInfoSet = new HTTP_SERVICE_CONFIG_URLACL_SET();
|
||||||
|
inputConfigInfoSet.KeyDesc = keyDesc;
|
||||||
|
inputConfigInfoSet.ParamDesc = paramDesc;
|
||||||
|
|
||||||
|
IntPtr pInputConfigInfo = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_URLACL_SET)));
|
||||||
|
Marshal.StructureToPtr(inputConfigInfoSet, pInputConfigInfo, false);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
retVal = HttpApi.HttpSetServiceConfiguration(IntPtr.Zero,
|
||||||
|
HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo,
|
||||||
|
pInputConfigInfo,
|
||||||
|
Marshal.SizeOf(inputConfigInfoSet),
|
||||||
|
IntPtr.Zero);
|
||||||
|
|
||||||
|
if ((uint)ERROR_ALREADY_EXISTS == retVal) // ERROR_ALREADY_EXISTS = 183
|
||||||
|
{
|
||||||
|
retVal = HttpApi.HttpDeleteServiceConfiguration(IntPtr.Zero,
|
||||||
|
HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo,
|
||||||
|
pInputConfigInfo,
|
||||||
|
Marshal.SizeOf(inputConfigInfoSet),
|
||||||
|
IntPtr.Zero);
|
||||||
|
|
||||||
|
if ((uint)NOERROR == retVal)
|
||||||
|
{
|
||||||
|
retVal = HttpApi.HttpSetServiceConfiguration(IntPtr.Zero,
|
||||||
|
HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo,
|
||||||
|
pInputConfigInfo,
|
||||||
|
Marshal.SizeOf(inputConfigInfoSet),
|
||||||
|
IntPtr.Zero);
|
||||||
|
}
|
||||||
|
else if ((uint)ERROR_FILE_NOT_FOUND == retVal) // ERROR_FILE_NOT_FOUND = 2
|
||||||
|
{
|
||||||
|
string networkURLOld = networkURL.Contains("https") ? networkURL.Replace("https", "http") :
|
||||||
|
networkURL.Replace("http", "https");
|
||||||
|
HTTP_SERVICE_CONFIG_URLACL_KEY keyDescOld = new HTTP_SERVICE_CONFIG_URLACL_KEY(networkURLOld);
|
||||||
|
HTTP_SERVICE_CONFIG_URLACL_PARAM paramDescOld = new HTTP_SERVICE_CONFIG_URLACL_PARAM(securityDescriptor);
|
||||||
|
|
||||||
|
HTTP_SERVICE_CONFIG_URLACL_SET inputConfigInfoSetOld = new HTTP_SERVICE_CONFIG_URLACL_SET();
|
||||||
|
inputConfigInfoSetOld.KeyDesc = keyDescOld;
|
||||||
|
inputConfigInfoSetOld.ParamDesc = paramDescOld;
|
||||||
|
|
||||||
|
IntPtr pInputConfigInfoOld = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_URLACL_SET)));
|
||||||
|
Marshal.StructureToPtr(inputConfigInfoSetOld, pInputConfigInfoOld, false);
|
||||||
|
|
||||||
|
retVal = HttpApi.HttpDeleteServiceConfiguration(IntPtr.Zero,
|
||||||
|
HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo,
|
||||||
|
pInputConfigInfoOld,
|
||||||
|
Marshal.SizeOf(inputConfigInfoSetOld),
|
||||||
|
IntPtr.Zero);
|
||||||
|
|
||||||
|
if ((uint)NOERROR == retVal)
|
||||||
|
{
|
||||||
|
retVal = HttpApi.HttpSetServiceConfiguration(IntPtr.Zero,
|
||||||
|
HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo,
|
||||||
|
pInputConfigInfo,
|
||||||
|
Marshal.SizeOf(inputConfigInfoSet),
|
||||||
|
IntPtr.Zero);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Marshal.FreeCoTaskMem(pInputConfigInfo);
|
||||||
|
HttpApi.HttpTerminate(HttpApi.HTTP_INITIALIZE_CONFIG, IntPtr.Zero);
|
||||||
|
}
|
||||||
|
if ((uint)NOERROR != retVal)
|
||||||
|
{
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private static void ThrowWin32ExceptionIfError(uint retVal)
|
||||||
|
{
|
||||||
|
if (NOERROR != retVal)
|
||||||
|
{
|
||||||
|
throw new Win32Exception(Convert.ToInt32(retVal));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void CallHttpApi(Action body)
|
||||||
|
{
|
||||||
|
uint retVal = HttpInitialize(HttpApiVersion, HTTP_INITIALIZE_CONFIG, IntPtr.Zero);
|
||||||
|
ThrowWin32ExceptionIfError(retVal);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
body();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
HttpTerminate(HTTP_INITIALIZE_CONFIG, IntPtr.Zero);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates an unmanaged sockaddr structure to pass to a WinAPI function.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ipEndPoint">IP address and port number</param>
|
||||||
|
/// <returns>a handle for the structure. Use the AddrOfPinnedObject Method to get a stable pointer to the object. </returns>
|
||||||
|
/// <remarks>When the handle goes out of scope you must explicitly release it by calling the Free method; otherwise, memory leaks may occur. </remarks>
|
||||||
|
private static GCHandle CreateSockaddrStructure(IPEndPoint ipEndPoint)
|
||||||
|
{
|
||||||
|
SocketAddress socketAddress = ipEndPoint.Serialize();
|
||||||
|
|
||||||
|
// use an array of bytes instead of the sockaddr structure
|
||||||
|
byte[] sockAddrStructureBytes = new byte[socketAddress.Size];
|
||||||
|
GCHandle sockAddrHandle = GCHandle.Alloc(sockAddrStructureBytes, GCHandleType.Pinned);
|
||||||
|
for (int i = 0; i < socketAddress.Size; ++i)
|
||||||
|
{
|
||||||
|
sockAddrStructureBytes[i] = socketAddress[i];
|
||||||
|
}
|
||||||
|
return sockAddrHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reads the unmanaged sockaddr structure returned by a WinAPI function
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="pSockaddrStructure">pointer to the unmanaged sockaddr structure</param>
|
||||||
|
/// <returns>IP address and port number</returns>
|
||||||
|
private static IPEndPoint ReadSockaddrStructure(IntPtr pSockaddrStructure)
|
||||||
|
{
|
||||||
|
short sAddressFamily = Marshal.ReadInt16(pSockaddrStructure);
|
||||||
|
AddressFamily addressFamily = (AddressFamily)sAddressFamily;
|
||||||
|
|
||||||
|
int sockAddrSructureSize;
|
||||||
|
IPEndPoint ipEndPointAny;
|
||||||
|
switch (addressFamily)
|
||||||
|
{
|
||||||
|
case AddressFamily.InterNetwork:
|
||||||
|
// IP v4 address
|
||||||
|
sockAddrSructureSize = 16;
|
||||||
|
ipEndPointAny = new IPEndPoint(IPAddress.Any, 0);
|
||||||
|
break;
|
||||||
|
case AddressFamily.InterNetworkV6:
|
||||||
|
// IP v6 address
|
||||||
|
sockAddrSructureSize = 28;
|
||||||
|
ipEndPointAny = new IPEndPoint(IPAddress.IPv6Any, 0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new ArgumentOutOfRangeException("pSockaddrStructure", "Unknown address family");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// get bytes of the sockadrr structure
|
||||||
|
byte[] sockAddrSructureBytes = new byte[sockAddrSructureSize];
|
||||||
|
Marshal.Copy(pSockaddrStructure, sockAddrSructureBytes, 0, sockAddrSructureSize);
|
||||||
|
|
||||||
|
// create SocketAddress from bytes
|
||||||
|
var socketAddress = new SocketAddress(AddressFamily.Unspecified, sockAddrSructureSize);
|
||||||
|
for (int i = 0; i < sockAddrSructureSize; i++)
|
||||||
|
{
|
||||||
|
socketAddress[i] = sockAddrSructureBytes[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// create IPEndPoint from SocketAddress
|
||||||
|
IPEndPoint result = (IPEndPoint)ipEndPointAny.Create(socketAddress);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Security.Principal;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace WebserverInitalConfig
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
if (args.Length != 2)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Usage: WebserverInitalConfig port isHttps");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[1].ToLower() == "true")
|
||||||
|
{
|
||||||
|
string hostname = Dns.GetHostName();
|
||||||
|
var cert = ConfigHttpApi.getSelfSignedCert("CN=" + hostname + " C=DE O=Vocaluxe OU=Vocaluxe Server");
|
||||||
|
ConfigHttpApi.addCertToStore(cert);
|
||||||
|
ConfigHttpApi.bindCert("0.0.0.0", Int32.Parse(args[0]), cert);
|
||||||
|
ConfigHttpApi.reserveURL("https://+:" + args[0] + "/");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ConfigHttpApi.reserveURL("http://+:" + args[0] + "/");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// Allgemeine Informationen über eine Assembly werden über die folgenden
|
||||||
|
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
|
||||||
|
// die mit einer Assembly verknüpft sind.
|
||||||
|
[assembly: AssemblyTitle("WebserverInitalConfig")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("WebserverInitalConfig")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2013")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar
|
||||||
|
// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von
|
||||||
|
// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
|
||||||
|
[assembly: Guid("b2df9255-3927-4125-ab3c-23c35794b04d")]
|
||||||
|
|
||||||
|
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
|
||||||
|
//
|
||||||
|
// Hauptversion
|
||||||
|
// Nebenversion
|
||||||
|
// Buildnummer
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
|
||||||
|
// übernehmen, indem Sie "*" eingeben:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{55F89808-4E79-4FFE-BC13-48258913F5C9}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>WebserverInitalConfig</RootNamespace>
|
||||||
|
<AssemblyName>WebserverInitalConfig</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>..\Output\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Security">
|
||||||
|
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 11.0\Libs\clrsecurity_june10\Security.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Security.Cryptography">
|
||||||
|
<HintPath>..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 11.0\Libs\clrsecurity_june10\Security.Cryptography.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="ConfigHttpApi.cs" />
|
||||||
|
<Compile Include="HttpApi.cs" />
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="App.config" />
|
||||||
|
<None Include="app.manifest">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
|
||||||
|
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||||
|
<security>
|
||||||
|
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<!-- UAC-Manifestoptionen
|
||||||
|
Wenn Sie die Zugangsebene für das Windows-Benutzerkonto ändern möchten, ersetzen Sie den
|
||||||
|
requestedExecutionLevel-Knoten durch eines der folgenden Elemente.
|
||||||
|
|
||||||
|
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||||
|
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
|
||||||
|
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
|
||||||
|
|
||||||
|
Durch Angeben des requestedExecutionLevel-Knotens wird die Datei- und Registrierungsvirtualisierung deaktiviert.
|
||||||
|
Wenn Sie Datei- und Registrierungsvirtualisierung für Abwärts-
|
||||||
|
kompatibilität verwenden möchten, löschen Sie den requestedExecutionLevel-Knoten.
|
||||||
|
-->
|
||||||
|
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
|
||||||
|
</requestedPrivileges>
|
||||||
|
</security>
|
||||||
|
</trustInfo>
|
||||||
|
|
||||||
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||||
|
<application>
|
||||||
|
<!-- Eine Liste aller Windows-Versionen, mit denen die Anwendung kompatibel ist.
|
||||||
|
Windows wählt automatisch die am stärksten kompatible Umgebung aus.-->
|
||||||
|
|
||||||
|
<!-- Wenn die Anwendung mit Windows Vista kompatibel ist, heben Sie die Auskommentierung des folgenden supportedOS-Knotens auf-->
|
||||||
|
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"></supportedOS>-->
|
||||||
|
|
||||||
|
<!-- Wenn die Anwendung mit Windows 7 kompatibel ist, heben Sie die Kommentierung des folgenden supportedOS-Knotens auf.-->
|
||||||
|
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>-->
|
||||||
|
|
||||||
|
<!-- Wenn die Anwendung mit Windows 8 kompatibel ist, heben Sie die Auskommentierung des folgenden supportedOS-Knotens auf-->
|
||||||
|
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"></supportedOS>-->
|
||||||
|
|
||||||
|
</application>
|
||||||
|
</compatibility>
|
||||||
|
|
||||||
|
<!-- Designs für allgemeine Windows-Steuerelemente und -Dialogfelder (Windows XP und höher) aktivieren -->
|
||||||
|
<!-- <dependency>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity
|
||||||
|
type="win32"
|
||||||
|
name="Microsoft.Windows.Common-Controls"
|
||||||
|
version="6.0.0.0"
|
||||||
|
processorArchitecture="*"
|
||||||
|
publicKeyToken="6595b64144ccf1df"
|
||||||
|
language="*"
|
||||||
|
/>
|
||||||
|
</dependentAssembly>
|
||||||
|
</dependency>-->
|
||||||
|
|
||||||
|
</asmv1:assembly>
|
||||||
Reference in new issue
Block a user