Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

310 lines
8.2 KiB

using System;
using System.Security.Principal;
using System.Threading;
using System.Diagnostics;
using System.Runtime.InteropServices;
using UDDI;
using UDDI.Replication;
namespace UDDI.Tools
{
[ StructLayout( LayoutKind.Sequential ) ]
internal class SECURITY_ATTRIBUTES
{
public int nLength;
public object lpSecurityDescriptor;
public bool bInheritHandle;
public SECURITY_ATTRIBUTES()
{
nLength = Marshal.SizeOf( typeof( SECURITY_ATTRIBUTES ) );
lpSecurityDescriptor = null;
bInheritHandle = false;
}
}
internal enum SystemErrorCodes
{
ERROR_SUCCESS = 0,
ERROR_ALREADY_EXISTS = 183
}
//
// TODO add more values as we need them
//
internal enum FileHandleValues
{
INVALID_HANDLE_VALUE = -1
}
//
// TODO add more values as we need them
//
internal enum SharedFileProtection : byte
{
PAGE_READONLY = 0x02
}
internal class SharedMemory
{
int hSharedMemory;
const int INVALID_HANDLE_VALUE = -1;
public bool Create( string name )
{
hSharedMemory = -1;
bool success = false;
try
{
SECURITY_ATTRIBUTES securityAttributes = new SECURITY_ATTRIBUTES();
hSharedMemory = CreateFileMapping( ( int )FileHandleValues.INVALID_HANDLE_VALUE,
securityAttributes,
( int )SharedFileProtection.PAGE_READONLY,
0,
1,
name );
if( ( int )SystemErrorCodes.ERROR_SUCCESS == GetLastError() )
{
success = true;
}
}
catch
{
if( -1 != hSharedMemory )
{
CloseHandle( hSharedMemory );
}
}
return success;
}
public void Release()
{
if( -1 != hSharedMemory )
{
CloseHandle( hSharedMemory );
}
}
[DllImport( "user32.dll", CharSet=CharSet.Auto )]
private static extern int MessageBox(int hWnd, String text, String caption, uint type);
[DllImport( "kernel32.dll", SetLastError=true )]
private static extern int CreateFileMapping( int hFile,
SECURITY_ATTRIBUTES lpAttributes,
int flProtect,
int dwMaximumSizeHigh,
int dwMaximumSizeLow,
string lpName );
[DllImport( "kernel32.dll" )]
private static extern bool CloseHandle( int hObject );
[DllImport( "kernel32.dll" )]
private static extern int GetLastError();
}
public class ReplicationUtility
{
public static string OperatorKey = null;
/// ****************************************************************
/// public Main [static]
/// ----------------------------------------------------------------
/// <summary>
/// Program entry point.
/// </summary>
/// ----------------------------------------------------------------
/// <param name="args">
/// Command-line arguments.
/// </param>
/// ****************************************************************
///
public static void Main( string[] args )
{
//
// Use shared memory to make sure that only 1 instance of this process is running. sharedMemory.Release() MUST
// be called when this process exits in order to free up the shared memory.
//
SharedMemory sharedMemory = new SharedMemory();
try
{
Console.WriteLine( "Microsoft (R) UDDI Replication Utility" );
Console.WriteLine( "Copyright (C) Microsoft Corp. 2002. All rights reserved." );
Console.WriteLine();
if( false == sharedMemory.Create( "UDDI_replication_process" ) )
{
Console.WriteLine( "Only 1 instance of this process can be running." );
System.Environment.Exit( 1 );
}
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal( identity );
Context.User.SetRole( principal );
if( !Context.User.IsAdministrator )
{
Console.WriteLine( "Access denied.\r\n\r\nThis program must be executed by a member of the '"
+ Config.GetString( "GroupName.Administrators" ) + "'\r\ngroup. The current user '"
+ identity.Name + "' is not a member of this group." );
return;
}
ProcessCommandLine( args );
ConnectionManager.Open( true, false );
try
{
if( null == OperatorKey )
ReplicationHelper.Replicate();
else
ReplicationHelper.ReplicateWithNode( OperatorKey );
}
finally
{
ConnectionManager.Close();
}
}
catch( CommandLineException e )
{
if( null != e.Message && e.Message.Length > 0 )
Console.WriteLine( e.Message );
else
DisplayUsage();
}
catch( Exception e )
{
Console.WriteLine( e.ToString() );
}
finally
{
sharedMemory.Release();
}
}
/// ****************************************************************
/// internal ProcessCommandLine [static]
/// ----------------------------------------------------------------
/// <summary>
/// Parse the command-line.
/// </summary>
/// ----------------------------------------------------------------
/// <param name="args">
/// Command-line arguments.
/// </param>
/// ****************************************************************
internal static void ProcessCommandLine( string[] args )
{
int i = 0;
while( i < args.Length )
{
if( '-' == args[ i ][ 0 ] || '/' == args[ i ][ 0 ] )
{
//
// Process the switch.
//
switch( args[ i ].Substring( 1 ).ToLower() )
{
case "o":
if( i + 1 >= args.Length )
throw new CommandLineException( "Missing required parameter 'operatorkey'" );
i ++;
try
{
OperatorKey = new Guid( args[ i ] ).ToString();
}
catch
{
throw new CommandLineException( "Invalid operator key specified." );
}
break;
case "?":
goto case "help";
case "help":
throw new CommandLineException( "" );
default:
throw new CommandLineException( "Unknown switch '" + args[i] + "'." );
}
}
i ++;
}
}
public static void DisplayUsage()
{
Console.WriteLine( "Syntax:" );
Console.WriteLine( " replicate.exe <switches>" );
Console.WriteLine();
Console.WriteLine( "Switches:" );
Console.WriteLine( " -o <operatorkey> Replicates against the specified" );
Console.WriteLine( " operator only." );
Console.WriteLine( " -? Displays this help message." );
Console.WriteLine();
Console.WriteLine( "Examples:" );
Console.WriteLine( " replicate.exe" );
Console.WriteLine( " replicate.exe -o F6D80408-A206-4b85-B2F4-699EFA13A669" );
Console.WriteLine();
}
}
/// ****************************************************************
/// public class CommandLineException
/// ----------------------------------------------------------------
/// <summary>
/// Exception class for errors encountered while parsing the
/// command-line.
/// </summary>
/// ****************************************************************
///
public class CommandLineException : ApplicationException
{
/// ************************************************************
/// public CommandLineException [constructor]
/// ------------------------------------------------------------
/// <summary>
/// CommandLineException constructor.
/// </summary>
/// ************************************************************
///
public CommandLineException()
: base()
{
}
/// ************************************************************
/// public CommandLineException [constructor]
/// ------------------------------------------------------------
/// <summary>
/// CommandLineException constructor.
/// </summary>
/// ------------------------------------------------------------
/// <param name="message">
/// Exception message.
/// </param>
/// ************************************************************
///
public CommandLineException( string message )
: base( message )
{
}
}
}