سؤال

لدي ASP.NET التطبيق.في الأساس عملية التسليم هذه هي :

  • نانت يبني التطبيق يخلق ملف مضغوط على الكمبيوتر الخاص المطور مع ملفات التطبيق دون إس المجلدات والملفات عديمة الفائدة.هذا الملف يتم تسليم مع نانت النصي.
  • الرمز البريدي و نانت يتم نسخ الملفات إلى جهاز الكمبيوتر العميل
  • في نانت النصي يستبدل الموقع الحالي الملفات مع الملفات الموجودة في الملف المضغوط.

مشكلتي هي أن هذه العملية يجب الوصول غير المصرح به خطأ عند محاولة فتح الموقع.يبدو أن الملفات يجب أن يكون لديك إذن تعيين المستخدم "IIS_WPG".

ليس لدي القدرة على تغيير تكوين IIS لذلك يجب أن يدويا تغيير الأذونات من كل ملف.وفي كل مرة كنت استبدال الملفات الأذونات يتم إزالة أريد أن مجموعة منهم مرة أخرى.

لذلك لدي سؤالان :

  • هل يمكنني تغيير أذونات الملفات مع نانت ?كيف نفعل ذلك ؟
  • هل من الممكن تجنب هذه المشكلة ؟ (المطورين لم يكن لديك هذا المستخدم على أجهزة الكمبيوتر الخاصة بهم)
هل كانت مفيدة؟

المحلول

تحتاج إلى تشغيل برنامج CACLS في نظام التشغيل Windows لمنح الأذونات للملفات والمجلدات.من Nant، يمكنك القيام بذلك باستخدام مهمة EXEC.

جرب كتلة العلامات مثل:

<exec program="cacls">
    <arg value="*" />
    <arg value="/G IIS_WPG:F" />
</exec>

نصائح أخرى

@جيف فريتز آخ...اقتراحك هو الحل الصحيح ولكن المعلمات...خطير :).

على ديف أجهزة الكمبيوتر أنا بتسجيل الدخول كمسؤول و حاولت اقتراحك مع cmd.

  • فإنه يستبدل كل مجموعة أذونات من أجل تحديد فقط تلك المحددة في الأمر (حتى بعد الأمر الوصول إلى الملفات أدى إلى "رفض الوصول" حتى مع المشرف المستخدم)
  • فإنه يطبق على C:\WINDOWS\ directory, بينما دعا الأمر من مجلد wwwroot.:)

بعد الاختبارات حق الأمر :

cacls [full folder path] /T /E /G IIS_WPG:F
  • /T :ينطبق على تحديد المجلد والمجلدات الفرعية
  • /E : التعديلات دوري أبطال آسيا بدلا من استبدال من ذلك :)

لقد انتهى بنا الأمر إلى كتابة مهمتنا الخاصة لهذا باستخدام بعض التعليمات البرمجية المباشرة إلى حد ما:

[TaskName("addusertodir")]
public class AddUserToDirectorySecurity : Task
{
    [TaskAttribute("dir", Required=true)]
    public string DirPath { get; set; }

    [TaskAttribute("user", Required=true)]
    public string UserName { get; set; }

    protected override void ExecuteTask()
    {
        FileSystemAccessRule theRule1 = new FileSystemAccessRule(UserName, FileSystemRights.ListDirectory, AccessControlType.Allow);
        FileSystemAccessRule theRule2 = new FileSystemAccessRule(UserName, FileSystemRights.ReadAndExecute, AccessControlType.Allow);
        FileSystemAccessRule theRule3 = new FileSystemAccessRule(UserName, FileSystemRights.Read, AccessControlType.Allow);

        DirectorySecurity theDirSecurity = new DirectorySecurity();
        theDirSecurity.AddAccessRule(theRule1);
        theDirSecurity.AddAccessRule(theRule2);
        theDirSecurity.AddAccessRule(theRule3);
        Directory.SetAccessControl(DirPath, theDirSecurity);
    }
}

بعد ذلك يمكنك كتابة برنامج نصي nant يقوم بتحميل المهمة المخصصة وتنفيذها:

<loadtasks>
    <fileset>
        <include name="MyTask.dll"/>
    </fileset>
</loadtasks>

<addusertodir dir="MyDir" user="IIS_WPG"/>

من الواضح أنه يمكن تعديل هذا وفقًا لقواعد معينة لديك أو يمكنك حتى تحديد معلمات ذلك في المهمة إذا كنت ترغب في ذلك.لقد فضلنا ذلك على استخدام مهمة exec لأنها تتيح لنا مزيدًا من التحكم في الأذونات التي تم تطبيقها.

تم الآن إهمال CACLS.وإليك الإصدار الذي يستخدم ICACLS، البديل.

لنفترض أن لدينا ما يلي:

  • المجلد الجذر للتثبيت لدينا هو "c:\inetpub\wwwroot"، ويتم تخزينه في متغير NANT ${paths.myprogram.inetpub}
  • المجلد الذي نريد تعديله يسمى "التحميلات"، ويتم تخزينه فيه ${upload.foldername}
  • المستخدم الذي نريد منح حق الوصول إليه هو "IIS_UPLOAD_USER"، المخزن فيه ${iis.upload.user}
  • مستوى الإذن الذي نريد منحه هو "M"، لأذونات "التعديل" المخزنة فيه ${iis.user.permissionlevel}

ومع هذه الافتراضات فإن مهمتنا هي:

<exec program="icacls">
    <arg value="${path::combine(paths.myprogram.inetpub, upload.foldername)}" />
    <arg value="/grant" />
    <arg value="${iis.upload.user}:${iis.user.permissionlevel}" />
</exec>

أتمنى أن يساعدك هذا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top