Friday, April 16, 2010

Refresh All Views in Database with T-SQL


To refresh all view definitions in SQLServer, see this article.

"Why - o why will I ever need this," you might say. 

You will know when the time is right.



 

Friday, March 19, 2010

Trust

"Perceptions of trustworthiness often arise from the consistency between what you say and what you do."

- Shill and Moussa, The Art of Woo, Pg 107

Wednesday, March 17, 2010

Online Paint

Ever wanted to draw something online?
  • Aviary.com: This one does a very nice job of giving you advanced editing features such as layers and such.  While at it, also check out the music studio and fire-fox add-on which lets you snap pictures of sections of web pages.  Well done.
  • Google docs: You can now insert images right into your google doc.  Well done.  Each strokes can overlap, yet each one is automatically in a layer of its own.  You can bring it forward and back.
  • Digital drawing: it gives you the jpg preview online
  • Art Pad: Pretty cool, but they want your email address so they can email your picture to you.

Thursday, March 11, 2010

Automating Impersonation in C# Code

Here's a quick way to impersonate in code. An example usage is provided at the bottom.
Create a new page in your App_Code folder and paste the following code there:
using System;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Security.Permissions;



[assembly: SecurityPermissionAttribute(SecurityAction.RequestMinimum, UnmanagedCode = true)]
[assembly: PermissionSetAttribute(SecurityAction.RequestMinimum, Name = "FullTrust")]
public class CustomImpersonation
{

    #region Fields

    private IntPtr tokenHandle = new IntPtr(0);
    private IntPtr dupeTokenHandle = new IntPtr(0);
    private WindowsImpersonationContext impersonationContext;

    #endregion

    #region Ctor
    public CustomImpersonation() : base() { }
    #endregion

    #region Extern Public Methods
    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
        int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
    //[DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    //private unsafe static extern int FormatMessage(int dwFlags, ref IntPtr lpSource,
    //    int dwMessageId, int dwLanguageId, ref String lpBuffer, int nSize, IntPtr* Arguments);
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public extern static bool CloseHandle(IntPtr handle);
    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public extern static bool DuplicateToken(IntPtr ExistingTokenHandle,
        int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
    #endregion
    #region Public Methods
    /// 
    /// Pass user account you wish to impersonate.
    /// 
    /// 
///
///
[PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")] public void Impersonate(string userName, string password, string domainName) { try { const int LOGON32_PROVIDER_DEFAULT = 0; //This parameter causes LogonUser to create a primary token. const int LOGON32_LOGON_INTERACTIVE = 2; this.tokenHandle = IntPtr.Zero; // Call LogonUser to obtain a handle to an access token. bool returnValue = LogonUser(userName, domainName, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref tokenHandle); if (false == returnValue) { int ret = Marshal.GetLastWin32Error(); throw new System.ComponentModel.Win32Exception(ret); } // Use the token handle returned by LogonUser. WindowsIdentity newId = new WindowsIdentity(tokenHandle); this.impersonationContext = newId.Impersonate(); } catch (Exception ex) { throw ex; } } /// /// Stop impersonating the user. /// ///
[PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")] public void Undo() { this.impersonationContext.Undo(); // Free the tokens. if (this.tokenHandle != IntPtr.Zero) CloseHandle(this.tokenHandle); } #endregion }
Example:
//create new instance
CustomImpersonation myImpersonation = new CustomImpersonation();
try
{
    // start impersonation                
    myImpersonation.Impersonate("username","password","domain");

    //put the code you want to run while impersonating the user account here
} catch(Exception ex) {
 throw ex;
} finally {
 myImpersonation.Undo();
}

How to Write to the Event Log using C#

 /// 
    ///  Logs a message to the eventlog and returns true if successful.
    /// 
    public static bool LogMessageToEventLog(string source, string logName, string message, EventLogEntryType eventType, int eventId)
    {
        //need to impersonate user in order to gain access to the EventLog.SourceExists method
        System.Security.Principal.WindowsImpersonationContext impersonationContext=null;
        try
        {
            //impersonate the current windows user -- assumes your application is using windows authentication
            impersonationContext = ((System.Security.Principal.WindowsIdentity)HttpContext.Current.User.Identity).Impersonate();



            //First we need to make sure that this source doesnt exist yet
            if (!EventLog.SourceExists(source))
            {
                //Create our source by providing the source and the name of the
                //new log name
                EventLog.CreateEventSource(source, logName);

                //Due to latency we want to wait a bit for the source and
                //log to be created. So we will sleep for 3 seconds
                System.Threading.Thread.Sleep(3000);
            }

            //Now we need a new instance of the EventLog
            EventLog log = new EventLog();
            //Set the source we're writing to
            log.Source = source;

            //Now write an entry
            log.WriteEntry(message, eventType, eventId);
            Debug.Print(message);
            return true;
        }
        catch (Exception ex)
        {
            Debug.Print(ex.Message);
            return false;
        }
        finally {
            if (impersonationContext != null) impersonationContext.Undo();
        }


    }