مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

sadeghpa80

عضویت از 1392/09/18

آپلود فایل در یک پوشه با رمز خاص

  • سه شنبه 29 مهر 1399
  • 14:40
تشکر میکنم

با سلام من یک برنامه ساده نوشتم در ویندوز فرم  برای آپلود فایل در سرور شرکت 
حالا این برنامه فایل ها رو روی یک فولدر کپی میکنه که همه پرسنل فقط قابلیت خواندن دارن 

من چجوری به این برنامه دسترسی نوشتن بدم ؟
یعنی چجوری به این برنامه بگم برو با فلان یوز که دسترسی فول داره این فایل ها رو کپی کن ؟

در ضمن سیستم ها دامین هستن 

 

ممنون از شما 

پاسخ های این پرسش

تعداد پاسخ ها : 4 پاسخ
کاربر سایت

رضا نصیری

عضویت از 1392/10/01

  • چهارشنبه 30 مهر 1399
  • 11:56

دوست عزیز سلام.

ابتدا این کلاس رو در پروژه خود بساز :

 

using System;
    using System.Security.Principal;
    using System.Runtime.InteropServices;
    using System.ComponentModel;

    public class Impersonator :
        IDisposable
    {
        public Impersonator(
            string userName,
            string domainName,
            string password)
        {
            ImpersonateValidUser(userName, domainName, password);
        }

        public void Dispose()
        {
            UndoImpersonation();
        }


        [DllImport("advapi32.dll", SetLastError = true)]
        private static extern int LogonUser(
            string lpszUserName,
            string lpszDomain,
            string lpszPassword,
            int dwLogonType,
            int dwLogonProvider,
            ref IntPtr phToken);

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern int DuplicateToken(
            IntPtr hToken,
            int impersonationLevel,
            ref IntPtr hNewToken);

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool RevertToSelf();

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        private static extern bool CloseHandle(
            IntPtr handle);

        private const int LOGON32_LOGON_INTERACTIVE = 2;
        private const int LOGON32_PROVIDER_DEFAULT = 0;

        private void ImpersonateValidUser(
            string userName,
            string domain,
            string password)
        {
            WindowsIdentity tempWindowsIdentity = null;
            IntPtr token = IntPtr.Zero;
            IntPtr tokenDuplicate = IntPtr.Zero;

            try
            {
                if (RevertToSelf())
                {
                    if (LogonUser(
                        userName,
                        domain,
                        password,
                        LOGON32_LOGON_INTERACTIVE,
                        LOGON32_PROVIDER_DEFAULT,
                        ref token) != 0)
                    {
                        if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
                        {
                            tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                            impersonationContext = tempWindowsIdentity.Impersonate();
                        }
                        else
                        {
                            throw new Win32Exception(Marshal.GetLastWin32Error());
                        }
                    }
                    else
                    {
                        throw new Win32Exception(Marshal.GetLastWin32Error());
                    }
                }
                else
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
            }
            finally
            {
                if (token != IntPtr.Zero)
                {
                    CloseHandle(token);
                }
                if (tokenDuplicate != IntPtr.Zero)
                {
                    CloseHandle(tokenDuplicate);
                }
            }
        }
        private void UndoImpersonation()
        {
            if (impersonationContext != null)
            {
                impersonationContext.Undo();
            }
        }

        private WindowsImpersonationContext impersonationContext = null;

    }

 

خب کار شما تمام است. هرجا خواستید هر پردازشی با یک یوزر خاصی انجام بدید کافیه از تکه کد زیر استفاده کنید:

 

     using (new Impersonator("userName", "domain", "password"))
            {
                //todo
            }

 

با جایگزین کردن نام کاربری و پسورد، نسبت به دسترسی هر کاربر میتونید کار انجام بدید. اگر کاربری دسترسی نداشت، خطای access denid دریافت خواهید کرد.

اگر جای سوالی بود باز در خدمتیم

کاربر سایت

sadeghpa80

عضویت از 1392/09/18

  • چهارشنبه 30 مهر 1399
  • 14:18

ممنون 

اینجوری 

الان من روی سرور یه یوزر بسازم با دسترسی فول و توی برنامه این یوزر جدید رو معرفی کنم 

روی سیستم کلاینت ها وقتی برنامه اجرا میشه برنامه دسترسی فول داره ؟
اما وقتی خود کلاینت با یوزر خودش وارد فایل شیرینگ ها میشه access dined میده بهش ؟ 
درسته ؟ 

کاربر سایت

رضا نصیری

عضویت از 1392/10/01

  • پنجشنبه 1 آبان 1399
  • 09:10

درود

برای کلاینت ها یا حتی خود سرور زمانی access dined  میده که دسترسی انجام یک کاری رو نداشته باشن.

کاربر سایت

sadeghpa80

عضویت از 1392/09/18

  • شنبه 3 آبان 1399
  • 12:07

با این کد نشد 

ببینید به عنوان مثال فولدر A کلاینت های من با یوزر خودشون به این فولدر دسترسی خواندن دارن 
اما یک یوزر مثلا به نام Majid در سرور دامین به فولدر A دسترسی فول داره 

حالا میخوام توی برنامه بگم در سیستم هر کلاینتی اجرا شدی برو با دسترسی یوزر Majid فایل رو توی اون فولدر A کپی کن 
در حالی که برنامه الان باز هم میره با یوز خود کلاینت ( که دسترسی فقط خواندنی داره ) اجرا میشه !

امیدوارم تونسته باشم منظورم رو برسونم 
 

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)