잊지 않겠습니다.

Network Copy등을 하기 위해서 ID와 Password를 알고 있는데, code 상으로 구현하는 방법을 한번 정리.

일단, WindowsIdentify는 win32 dll을 이용하고, Windows Token을 사용한다. Windows Token은 어떤 시스템에 Logon한 이후에, 일정시간 유지가 되는 Windows의 memory안에 자신의 Identity를 저장하게 된다. 

먼저, Win32의 [DllImport("advapi32.dll", SetLastError = true)] 를 이용해서 LogonUser method를 dll import 시켜온다.

        [DllImport("advapi32.dll", SetLastError = true)]
        public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);


마지막 값인 phToken값을 이용해서 WindowsIdentify를 얻어 내면 타 시스템에 접근이 가능하다. 여기에서 userName은 upn형태로 넣어져야지 되며, 이 형식은 ykyoon@vplex.net 과 같은 email과 같은 형식으로 입력이 되어야지 된다.

다음은 NetworkCopy를 하는 Test code이다. 




[DllImport("advapi32.dll", SetLastError = true)]
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);

public unsafe static string GetErrorMessage(int errorCode)
{
    int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100;
    int FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200;
    int FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000;

    int messageSize = 255;
    String lpMsgBuf = "";
    int dwFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS;

    IntPtr ptrlpSource = IntPtr.Zero;
    IntPtr prtArguments = IntPtr.Zero;

    int retVal = FormatMessage(dwFlags, ref ptrlpSource, errorCode, 0, ref lpMsgBuf, messageSize, &prtArguments);
    if(0 == retVal)
    {
        throw new Exception("Failed to format message for error code " + errorCode + ". ");
    }

    return lpMsgBuf;
}

static void Main(string[] args)
{
    const int LOGON32_PROVIDER_DEFAULT = 0;
    const int LOGON32_LOGON_INTERACTIVE = 2;
    const int SecurityImpersonation = 2;

    var tokenHandle = IntPtr.Zero;
    bool returnValue = LogonUser(@"Administrator@vplex.net", "network ip in here", "this is password", 9, 0, ref tokenHandle);
    Console.WriteLine("LogonUser called.");
    if(false == returnValue)
    {
        int ret = Marshal.GetLastWin32Error();
        Console.WriteLine("LogonUser failed with error code : {0}", ret);
        Console.WriteLine("\nError: [{0}] {1}\n", ret, GetErrorMessage(ret));
        int errorCode = 0x5; //ERROR_ACCESS_DENIED
        throw new System.ComponentModel.Win32Exception(errorCode);
    }
    else
    {
        var ykyoonAdmin = new WindowsIdentity(tokenHandle);
        var wic = ykyoonAdmin.Impersonate();
        File.Copy("C:\\System.Web.Mvc.dll", "\\\\10.30.3.24\\c$\\abc.dll", true);
        wic.Undo();
        wic.Dispose();
    }
    CloseHandle(tokenHandle);
}
Posted by Y2K
,
PropertyInfo를 이용해서 간단히 슥삭. 너무나 편하게 debuging할 수 있는 방법이라서 자주 사용하기도 하고, 긁어서 그냥 넣어주면 편해서 올려둔다. 기본적으로 Property Invoke를 이용해서 각 값을 얻어내고, 그 값을 표시하는 방법인데... 이모저모로 편하구. 



public override string ToString()
{
    StringBuilder sb = new StringBuilder();
    sb.AppendLine(string.Format("<{0}>", GetType().Name));
    foreach(PropertyInfo property in GetType().GetProperties())
    {
        string propertyName = property.Name;
        object value = property.GetValue(this, null);
        if(value != null)
        {
            if(value is IEnumerable && !(value is string))
            {
                sb.AppendLine(string.Format("<{0}>", propertyName));
                IEnumerator enumerator = ((IEnumerable)value).GetEnumerator();
                while(enumerator.MoveNext())
                {
                    sb.AppendLine(enumerator.Current.ToString());
                }
                sb.AppendLine(string.Format("", propertyName));
            }
            else
            {
                sb.AppendLine(string.Format("<{0}>{1}", propertyName, value.ToString()));
            }
        }
    }
    sb.Append(string.Format("", GetType().Name));
    return sb.ToString();
}
Posted by Y2K
,
개인적으로 굉장히 기대를 하고 있는 Windows 7 Phone Series가 드디어 나왔다.

보면, 재미있는 특징들이 있는데.. 
첫번째로, 스팩을 보면 상당히 천편일률적인 스팩과 디자인
두번째로, OS의 업그레이드는 MS에서 일괄적으로 배포
세번째로, UI의 차별화를 볼 수 있다.


첫번째의 경우에는... 이건 하드웨어 제조사들에게 축복이다. 
기존 안드로이드 폰들의 경우에는 안드로이드에 최적화된, 그리고 자신만의 UI를 넣기 위해서 자신들만의 안드로이드를 각 폰마다 새로 만들고 있었는데, Windows 7 Phone에는 전혀 그럴 필요가 없다. MS의 스팩대로만 만들어주면, 그 다음은 MS에서 알아서. 각 장치 드라이버 관리 뿐 아니라 표준화된 PC의 운영체제의 30년 노하우를 가진 기업이 알아서 처리한다. 왜 퀄컴이 이번 Windows 7 Phone에서 모든 제조업체를 뛰어넘고 MS의 최고 파트너가 되어있는지... 예전의 PC 시장의 Intel + MS 동맹과 같은 방법이다. 

두번째로는... 이건 기존 안드로이드폰들에게 재앙이 될수 있는 문제다.
기존 안드로이드폰의 계속되는 문제는 폰을 발매하고 나서 구글에서 OS 업그레이드를 하고, 그 업그레이드를 자신의 폰에 반영하기 위해서 또 인적자원을 투입해야지되는 악순환의 발생이다. 1.6->2.0->2.1->2.2 여기에 내년에 나올 3.0 업그레이드를 과연 기존 폰들이 할 수 있을까? 그리고, 제조 업체에서는 계속해서 하드웨어에 최적화된 안드로이드 버젼을 만들어낸다는 것은 폰을 팔아서 나온 이윤보다 사후관리가 더 문제가 되버린다. 애플은 앱스토어를 통해서 폰을 판매한 후에 지속적인 이윤을 얻을 수 있지만, 안드로이드는 그것이 불가능하다. 제조업의 특성상 (애플제외) 10~20% 이상 이윤을 얻기는 거의 불가능하다. 거기에 지속적인 업그레이드로 6~7 개월 이상 개발 인력을 그 폰에 계속해서 쏟아야지 된다면... 그건 재앙이다. -_-; 이 부분은 MS가 기존의 Windows upgrade를 관리하던 방법대로 한다면, 의외의 대박은 이 점에서 나올수도 있겠다는 생각이 든다. 제조사들의 코스트를 혁신적으로 줄일 수 있다는 말이지. (안드로이드는 절대 공짜가 아니다. 발머의 의견에 전적으로 동의한다.)

세번째로는 이건 호불호가 나뉠것 같은 의견이긴 하지만, 개인적으로는 MS만의 차이점을 주는 좋은 UI라고 생각된다.
애뮬레이터로 돌려보면 정말 직관적으로 알 수 있는 UI라는 것을 느낄수 있었고, 꼭 내 손으로 만져보고 싶은 그런 UI라는 욕심이 든다. 

이번 Windows Phone 7 발매는... 지금 가속화되어가고 있는.. (미국에서 갤럭시S가 공짜로 풀려있다는..) 스마트폰 시장의 레드오션을 더욱더 가속화하게 될 것 같다. 치킨게임하기에 딱 좋은 운영체제가 나와버렸다는 말이지.; 여기서 가장 좋은 위치는... 뭐니뭐니해도 삼성이다.; 모든 폰들에 들어가는 칩과 AMOLED, LCD를 자신이 생상하기 때문에 가장 적절한 가격으로 공급받고 뿌려버리는 것이 가능하다. 열받으면 경쟁사것 약간약간 막아주기까지 하면서 말이야.; 

애플의 고민은 이제부터 시작일 것 같다. 애플은 안타깝게 치킨게임에서 이긴적이 단 한번도 없다. 애플의 마인드는 새로운 것을 개척하고 놀라움을 주기에는 충분하나, 레드오션에서 자신이 승자가 되기에는 매우 안좋은 마인드를 가지고 있다. 결국, 예전에 했던 바보짓을 또하면 정말로 망하는건데... 과연 어떻게 될지? 




Posted by Y2K
,