Windows Programming µµ¿òÇÊ¿äÇÕ´Ï´Ù

   Á¶È¸ 4570   Ãßõ 0    

일전에 포스팅한 랜섬웨어에의한 파일손상예방이 가능한 백업서비스를 준비하고 있습니다.

http://2cpu.co.kr/freeboard_2011/984605

관련 SW를 개발하다가 난관에 부디처 도움을 요청합니다.  

괜히 시작한것 같아 불안합니다.  내년부턴 돈되는일 해야하는데...


1. Restore 프로그램을 C#으로 만드는데 UI Layout이 망가집니다.

Windows 7 영문, Win8, Win10, WinServer 2012, WinServer2016에서는 이렇게 나오는데

Windows7한글에서만 이렇게 나옵니다.

설치된 .NET은 모두 4.7입니다.

왜이럴까요?  

참고로 태어나서 GUI는 첨 만들어 봤는데 신세계입니다.


2. Windows 백업을 하는데 readdirectorychangesw API를 사용합니다.

그런데 https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-readdirectorychangesw 를 보면

readdirectorychangesw가 SMB3을 지원하고 SMB2에대한 언급이 없습니다.  이경우 대게는 지원하지 않는경우인데 지원하는것 처럼 보입니다.

그냥 지원한다고 믿고 사용해도 될까요?  Windows7에서는 SMB3를 지원하지 않아서 만약 readdirectorychangesw가 SMB2를 지원하지 않으면 문제가 생깁니다.


3. 백업 Agent를 WindowsService로 만들려고 하는데 초기 시작할때 특정 DRIVE가 NetworkDrive인지를 확인해야 합니다.

그래서 GetDriveTypeA라는 API를 사용하는데 이 API가 WindowsService에서 NetworkDrive를 만나면 에러가 발생합니다.

대충 보니까 Service는 "Local System", "Local Service", "Network Service"로 작동이 되는데 NetworkDrive는 다른 Credential로 연결을 합니다.

이경우 Service에서 사용하는 사용자 credential로는 NetworkDrive에 대한 정보를 가저오지 못하는것 같습니다.

혹시 해결하는 방법 아시는분 계신가요?

참고로 Windows에서 프로그램 첨 만들어 봅니다.  여기도 신세계입니다.

OSX는 마무리 했는데 Windows가 발목을 잡네요...


ªÀº±Û Àϼö·Ï ½ÅÁßÇÏ°Ô.
ȲÁø¿ì 2018-12
±Û²Ã µî Â÷ÀÌÀεí ÇÕ´Ï´Ù.
     
epowergate 2018-12
±×·³ Win7-K¸¸ ¹º°¡ ´Ù¸£´Ù´Â°Çµ¥ ´çÃé ¸ð¸£°Ú³×¿ä. 
ÀÌÂÊÀ¸·Î ¹º°¡ ã¾Æº¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.
°¨»çÇÕ´Ï´Ù.
±è»óÇõ2 2018-12
1.
½ºÄÉÀϸµ¸ðµå¿Í ÆùÆ®¿¡ µû¶ó OS¹öÀü/¾ð¾î¿¡ µû¶ó Á¶±Ý Â÷À̳¯ ¼ö ÀÖ½À´Ï´Ù.
¸ÞÀÎÆûÀÇ AutoScaleMode¸¦ ´Ù¸¥ ¼Ó¼º°ªÀ¸·Î º¯°æÇÏ¿©º¸½Ã±¸¿ä..
ÇÁ·Î±×·¥ÀÇ ÁøÀÔÁ¡ Main ÇÔ¼ö¿¡¼­
ÃÖ»ó´Ü¿¡ using System.Reflection;
Application.SetCompatibleTextRenderingDefault(false); ´ÙÀ½ÁÙ¿¡
typeof(Control).GetField("defaultFont", BindingFlags.Static | BindingFlags.NonPublic).SetValue(null, new System.Drawing.Font("gulim", 9.0F));
À¸·Î Çغ¸½Ã¸é ¸ðµç ÆûÄÁÆ®·Ñ·¯ÀÇ ±âº»ÆùÆ®°¡ ±¼¸²À¸·Î ¼³Á¤µË´Ï´Ù.


3. ¸»¾¸´ë·Î ¼­ºñ½º¿¡¼­ ±¸µ¿ÀÌµÉ °æ¿ì¿¡´Â »ç¿ëÀÚ È¯°æ¿¡¼­ ¼³Á¤µÈ ³×Æ®¿öÅ© µå¶óÀ̺ê´Â ÀÎÁõÀÌ µÇÁö¾Ê¾Æ Á¢±ÙÀÌ ºÒ°¡´ÉÇÕ´Ï´Ù.
¼­ºñ½º µ¥¸ó¿¡¼­ SYSTEM°èÁ¤À¸·Î Á¢±ÙÇϽ÷Á¸é Á÷Á¢ÀûÀ¸·Î \\SMBÈ£½ºÆ®\Share¸í À¸·Î Á¢±ÙÇÏ¿© WNetUseConnection API¸¦ »ç¿ëÇÏ¿© ÀÎÁõÀ» ó¸®ÇϽðųª,
ÇØ´ç ¼­ºñ½º¼³Á¤ÅÇ¿¡º¸½Ã¸é Log On ºÎºÐ¿¡ ƯÁ¤ »ç¿ëÀÚ·Î ¼­ºñ½º·Î µ¿À۵ǰԲûµµ °¡´ÉÇÕ´Ï´Ù.
     
±è»óÇõ2 2018-12
3. ÀÓÀÇÀÇ ³×Æ®¿öÅ©¿¡ °øÀ¯µÈ µå¶óÀ̺꿡 Á¢±ÙÇÏ´Â ·¡ÆÛ¸¦ ¼öÁ¤Çغ¸¾Ò½À´Ï´Ù. ½Ã³î·ÎÁö NASÀÇ SMB°øÀ¯ Á¢±ÙÀ¸·Î¸¸ Å×½ºÆ®Çغ¸¾Ò½À´Ï´Ù.
³×Æ®¿öÅ© µå¶óÀ̺ê·Î ÇÒ´çµÈ°ÍÀ» µå¶óÀ̺꿡¼­ ã´Â °ÍÀÌ ¾Æ´Ñ ³×Æ®¿öÅ©°æ·Î·Î ¹Ù·Î Á¢¼ÓÇÏ´Â ·¡ÆÛÀÔ´Ï´Ù.

* Ãß°¡ÀûÀÎ Æí¹ýÀ¸·Î´Â SYSTEM»ç¿ëÀÚ·Î µ¥¸óÀÌ ±¸µ¿½Ã¿¡ ±âÁ¸¿¡ User interfactive·Î ·Î±×ÀεǾîÀÖ´Â »ç¿ëÀÚ·Î AppDomain ¼¼¼ÇÀ» ImpersonateÇÏ´Â Context¸¦ ÀÛ¼ºÇؼ­ ³×Æ®¿öÅ© µå¶óÀ̺ê·Î Á¢±ÙÀÌ °¡´ÉÇϱ⵵ ÇÕ´Ï´Ù. (ÀÌ ¹æ¹ýÀÇ °æ¿ì Session tokenÀ» º¹Á¦ÇÏ¿© »ç¿ëÇϱ⠶§¹®¿¡ À©µµ¿ì »ç¿ëÀÚÀÇ ¾ÆÀ̵ð¿Í/ºñ¹Ð¹øÈ£´Â ºÒÇÊ¿äÇÕ´Ï´Ù)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Net;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {

            using(new NetworkConnection(@"\\nas.dc.local", new NetworkCredential("¾ÆÀ̵ð", "ºñ¹Ð¹øÈ£")))
            {
                Console.WriteLine("==== Files ====");
                foreach(string entry in System.IO.Directory.GetFiles(@"\\nas.dc.local\Downloads"))
                {
                    Console.WriteLine(entry);
                }

            }

            Console.ReadLine();

        }


        public class NetworkConnection : IDisposable
        {

            string _networkName;

            public NetworkConnection(string networkName,
                NetworkCredential credentials)
            {
                this._networkName = networkName;

                NetResource netResource = new NetResource()
                {
                    Scope = ResourceScope.GlobalNetwork,
                    ResourceType = ResourceType.Disk,
                    DisplayType = ResourceDisplaytype.Share,
                    RemoteName = networkName
                };

                string userName = string.IsNullOrEmpty(credentials.Domain) ? credentials.UserName : string.Format(@"{0}\{1}", credentials.Domain, credentials.UserName);

                int result = WNetAddConnection2(netResource, credentials.Password, userName, 0);

                if (result != 0)
                {
                    throw new Win32Exception(result);
                }
            }

            ~NetworkConnection()
            {
                Dispose(false);
            }

            public void Dispose()
            {
                Dispose(true);
                GC.SuppressFinalize(this);
            }

            protected virtual void Dispose(bool disposing)
            {
                WNetCancelConnection2(_networkName, 0, true);
            }

            [DllImport("mpr.dll")]
            private static extern int WNetAddConnection2(NetResource netResource,
                string password, string username, int flags);

            [DllImport("mpr.dll")]
            private static extern int WNetCancelConnection2(string name, int flags,
                bool force);
        }

        [StructLayout(LayoutKind.Sequential)]
        public class NetResource
        {
            public ResourceScope Scope;
            public ResourceType ResourceType;
            public ResourceDisplaytype DisplayType;
            public int Usage;
            public string LocalName;
            public string RemoteName;
            public string Comment;
            public string Provider;
        }

        public enum ResourceScope : int
        {
            Connected = 1,
            GlobalNetwork,
            Remembered,
            Recent,
            Context
        };

        public enum ResourceType : int
        {
            Any = 0,
            Disk = 1,
            Print = 2,
            Reserved = 8,
        }

        public enum ResourceDisplaytype : int
        {
            Generic = 0x0,
            Domain = 0x01,
            Server = 0x02,
            Share = 0x03,
            File = 0x04,
            Group = 0x05,
            Network = 0x06,
            Root = 0x07,
            Shareadmin = 0x08,
            Directory = 0x09,
            Tree = 0x0a,
            Ndscontainer = 0x0b
        }

    }
}
     
epowergate 2018-12
3.¿¡¼­ ¸»¾¸ÇϽô ¹æ¹ýÀ» °ËÅ並 Çغ¸±â´Â Çߴµ¥ ÀÌ·¯·Á¸é Admin ±ÇÇÑÀ» °¡Áø User·Î µî·ÏÀ» ÇؾßÇÕ´Ï´Ù.
±×·¯·Á¸é Install ½ÃÁ¡¿¡ »ç¿ëÀÚ°¡ Admin°èÁ¤ ID/PASSWD¸¦ ³Ö¾î¾ß Çϴµ¥ °æ¿ì¿¡ µû¶ó¼­ »ç¿ëÀÚ°¡ ±× Á¤º¸¸¦ ¸ð¸¦ ¼ö À־ ¹èÁ¦ÇÑ »óÅÂÀÔ´Ï´Ù.
°æ¿ì´Â 2°¡ÁöÀε¥
Admin °èÁ¤ÀÌ ÀÖ´Ù
  1. ÀÌ°É ¿ì¸®°¡ ¹Þ¾Æ¾ß Çϴµ¥ º¸¾È À̽´µîÀ¸·Î ¹Þ±â°¡ Á» ¹¹ÇÕ´Ï´Ù. »ç¿ëÀÚ°¡ ¿ì¸®¸¦ ¹» ¹Ï°í ÀÌÁ¤º¸¸¦ ÁÙ±î °í¹ÎÇغ» ³¡¿¡ ¹èÁ¦Çß½À´Ï´Ù.
Admin °èÁ¤ÀÌ ¾ø´Ù
  °æ¿ì1: Network Drive¸¦ Login »ç¿ëÀÚ °èÁ¤À¸·Î »ý¼ºÀ» ÇßÀ¸¸é °¡´É
  °æ¿ì2: ±â¾÷¿¡¼­ ADµîÀ» »ç¿ëÇؼ­ Network Drive¸¦ »ý¼ºÇßÀ¸¸é ¿©ÀüÈ÷ Á¢±ÙºÒ°¡
±×·¡¼­ ¸·Èù »óÅÂÀÔ´Ï´Ù.


ÀüÇô ´Ù¸¥¹®Á¦°¡ Àִµ¥ Network Drive°¡ UNC°¡ ¾Æ´Ñ Letter Drive·Î µÇ¾î ÀÖÀ¸¸é ¼­ºñ½º¿¡ ¸ðµå¿¡¼­´Â Á¢±ÙÀÌ ºÒ°¡´ÉÇÏ´Ù°í Çϳ׿ä.
À§¿¡¼­ ¼³¸íÇØ ÁֽŠ¹æ¹ýÀ» °í¹ÎÀ» Çغ¸±ä Çߴµ¥ ¹®Á¦´Â ÇØ´ç Network Drive¿¡ Á¢¼ÓÇÑ Á¢¼ÓÁ¤º¸¸¦ Application¿¡¼­ ¾Ë¼ö°¡ ¾ø½À´Ï´Ù.
»ç¿ëÀÚ¿¡°Ô ¹°¾îºÁ¾ßÇϴµ¥ ±×·¯±ä ½Ç°í ¶ÇÇÑ »ç¿ëÀÚ°¡ ¸ð¸¦ ¼öµµ À־ ¹èÁ¦ÇÑ »óÅÂÀÔ´Ï´Ù.
          
±è»óÇõ2 2018-12
»ç¿ëÀÚ¿¡°Ô º¸¾ÈÁ¤º¸¸¦ Á¦°ø¹ÞÀ» ¼ö ÀÖ´Â »óȲÀÌ ¾Æ´Ï¶ó¸é ÀϹÝÀûÀ¸·Î ¼­ºñ½º¸ðµå¿¡¼­´Â »ç¿ëÀÚ°èÁ¤¿¡¼­ »ý¼ºµÈ ³×Æ®¿öÅ© µå¶óÀ̺êÁ¢±ÙÀº ÀϹÝÀûÀÎ ¹æ¹ýÀ¸·Î´Â À©µµ¿ì º¸¾ÈÁ¤Ã¥»ó Èûµé °Í °°½À´Ï´Ù.
ÇÑ°¡Áö °¡´É¼ºÀÌ ÀÖ´Ù¸é À§¿¡ ¸»¾¸µå¸° ¹æ¹ýÁß¿¡ ¼­ºñ½º¸ðµå·Î µ¿ÀÛÇÑ »óÅ¿¡¼­ »ç¿ëÀÚ°¡ ·Î±×ÀεǾîÀÖ´Ù¸é »ç¿ëÀÚ ¼¼¼ÇÀ¸·Î ½ÇÇàÁßÀÎ explorer.exeÀÇ ÇÁ·Î¼¼½º¿¡¼­ session tokenÀ» °¡Á®¿Í¼­ ÅäÅ«À» º¹Á¦ ÈÄ »ç¿ëÀÚ ¼¼¼ÇÀ¸·Î °¡ÀåÇÏ¿© Á¢±ÙÇÏ´Â ¹æ½ÄÀÔ´Ï´Ù.
±âÁ¸¿¡ ·Î±×ÀÎ µÇ¾îÀÖ´Â »ç¿ëÀÚ¿¡ ÇÑÇØ ÅäÅ«À» º¹Á¦ÇÏ¿© °¡Á®¿À±â¶§¹®¿¡ »ç¿ëÀÚ¿¡°Ô º¸¾ÈÁ¤º¸¸¦ ÀԷ¹ÞÀ» ÇÊ¿ä´Â ¾ø½À´Ï´Ù.
±¸±Û¿¡¼­ c# service user Impersonate °Ë»öÇغ¸½Ã¸é ¿¹Á¦ ¼Ò½º°¡ ¸¹ÀÌ ³ª¿É´Ï´Ù..
¿¹Àü¿¡ ¿ø°ÝÁ¦¾î°ü·Ã ¼Ö·ç¼ÇÀ» °³¹ßÇϸ鼭, ¼­ºñ½º¸ðµå·Î µ¿ÀÛµÇ¾î °¢°¢ Å͹̳μ¼¼ÇÀÇ »ç¿ëÀÚÀÇ ÆÄÀÏ/È­¸éµîÀ» Á¦¾îÇϸ鼭 »ç¿ëÇß´ø ¹æ½ÄÀÔ´Ï´Ù.
°³¹ßÇϽô ÇÁ·Î±×·¥ÀÇ È¯°æÀ» Àß ¸ð¸£´Ùº¸´Ï, À̺κÐÀÌ ¸Â´ÂÁö ¸ð¸£°Ú³×¿ä
               
epowergate 2018-12
user Impersonate·Î ¾ÊµÇ´Â°Í ±îÁö´Â È®ÀÎÇß½À´Ï´Ù.
´ë·« ³»ÀϱîÁö ¸¶¹«¸®ÇÏÀÚ´Â °èȹÀ̾ú¾î¼­ ÀÌÁ¤µµ¿¡¼­ ¸¶¹«¸® ÇÏ·Á°í ÇÕ´Ï´Ù.
³ªÁß¿¡ ½Ã°£³ª¸é ´Ù½Ã º¼¼öµµ ÀÖ°Ú½À´Ï´Ù.
°¨»çÇÕ´Ï´Ù.
     
epowergate 2018-12
WPF°¡ ¹»±î¿ä?  ¾Æ¸¶µµ Á¦°¡ »ç¿ëÇÏ´Â °Í °°½À´Ï´Ù.
ElectronÀ̶õ³ÑÀº JAVAscript ±â¹ÝÀÎ°Í °°Àºµ¥ ÀÌ µ¿³»´Â ÀúÇÏ°í´Â °Å¸®°¡ ³Ê¹« ¸Ø´Ï´Ù.  °³ÀÎÀûÀ¸·Î´Â JavaScript¶ó´Â ¾ð¾î°¡ ÀÖ´ÂÁöµµ Àß ¸ð¸£°Ú½À´Ï´Ù.  ±×³É »çÅõ¸®¸¸ ÀܶàÀÖ´Â ¿Ü°è¾ð¾î·Î º¸ÀÔ´Ï´Ù.
´©±º°¡ ±×³É C#ÀÌ ½±´Ù°í Çؼ­ Ã¥ Æì³õ°í ¹è¿ö°¡¸é¼­ ««È÷ ¸¸µé°í ÀÖ°í ¾ÆÁ÷±îÁö´Â ¼º°øÀûÀÔ´Ï´Ù.
°¨»çÇÕ´Ï´Ù.
°³¹ß¿¡ ¼Õ¶©Áö ¿À·¡¶ó ¿¹Àü¾Ö ³×Æ®À§Å© µå¶óÀ̺ê üũÇϴµ¥ ¸¶Âù°¡Áö·Î ¿À·ù°¡ ³ª¼­ Æí¹ýÀ» ½è´ø°Å °°Àºµ¥ µå¶óÀ̺ê¸í ¾ø´Â°É È£ÃâÇÏ¸é ¿À·ù³µ´ø°¡ Çؼ­ ÇØ´ç µå¶óÀ̺긦 ÄÝÇغÁ¼­ ÀÌ»ó¾øÀ¸¸é µå¶óÀÌºê ¼Ó¼ºÀ» üũÇß´ø°Å °°Àºµ¥
     
epowergate 2018-12
¹®Á¦´Â ÇØ´ç µå¶óÀÌºê ¼Ó¼º üũµµ ¿¡·¯°¡ ³³´Ï´Ù.
´ÙÀ½À¸·Î´Â üũ¸¦ ¾î¶»°Ô Çصµ event monitoringÀ» ÇÒ¼ö°¡ ¾ø¾î¿ä...
°¨»çÇÕ´Ï´Ù
¹«¾Æ 2018-12
UI °ü·ÃµÈ °ÍÀ̶ó¸é À­ºÐ ¸»¾¸Ã³·³
ÇØ´ç Form ÀÇ AutoScaleMode ¼Ó¼ºÀ» None À¸·Î µÎ°í ºôµåÇغ¸¼¼¿ä. ´ëºÎºÐ Àß ¸Â´øµ¥¿ä. À©10ÀÇ ¸ð´ÏÅÍ ½ºÄÉÀϸµ ¹Ù²ãµµ Àß ¸Â°í.
±×·¡µµ ¾ÈµÈ´Ù¸é Æû Å©±â°¡ ¹Ù²î´Â À̺¥Æ®¸¦ ¹Þ¾Æ¼­ Å©±â¸¦ °è»êÇؼ­ ÄÁÆ®·Ñ Å©±â¸¦ Á¶ÀýÇؾßÇϴµ¥.. ±×·± ³ë°¡´Ù´Â.. º°·ÎÀϵí ÇÏ°í..
Àú´Â AutoScaleMode À» None À¸·Î µÎ´Â °Í°ú ÄÁÆ®·ÑÀÇ ¾ÞÄ¿ ±â´ÉÀ¸·Î ´ëÃæ À±°ûÀ» Àâ°í Ưº°ÇÑ °æ¿ì¿¡¸¸ Æû Å©±â º¯°æ À̺¥Æ®¿¡¼­ ¼ÕÀ» ºÁÁÝ´Ï´Ù.


QnA
Á¦¸ñPage 2353/5687
2015-12   1527272   ¹é¸Þ°¡
2014-05   4991287   Á¤ÀºÁØ1
2015-05   4570   ¸ø»ý±ä¾Ö
2017-11   4570   Psychophysi¡¦
2017-02   4570   ¸®¾óÈ«±¸
2007-04   4570   Á¶Áß¿¬
2017-03   4570   sunmask
2016-02   4570   ±ô¹Ú±ô¹Ú°¡
2006-10   4570   ÀÌÅÂÈñ
2015-01   4570   ³­´Ù°õ
2018-08   4570   ±è°Ç¿ì
2008-01   4570   ÇÑÀº¼®
2014-05   4570   °ÉÀνÅȫö
2016-04   4570   PiPPuuP
2006-07   4570   ±è´ë¼º
2008-08   4570   °ûÀç¼¼
2008-12   4570   ¿À»óÈÆ
2007-10   4570   À̱Լ·
2007-04   4570   ¹æÈ¿¹®
2014-07   4570   SpringValley
2014-05   4570   Nikon
2017-05   4570   À̼±±Ô