Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πρόβλημα με δικαιώματα Sharepoint

Îåêßíçóå áðü ôï ìÝëïò Eua. Τελευταία δημοσίευση από το μέλος eliasm στις 02-12-2008, 14:30. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  01-12-2008, 17:06 46609

    Πρόβλημα με δικαιώματα Sharepoint


    Καλησπέρα, έχω μια custom aspx στην οποία μια ρουτίνα διαγράφει ένα φάκελο στον server(με τα περιεχόμενα του) με την παρακάτω εντολή
    System.IO.Directory.Delete(newPath,true);


    αν και κάνω impersonation στην ρουτίνα έτσι ώστε να χρησιμοποιεί πάντα δικαιώματα admin η διαγραφή εκτελείται μόνο σε περίπτωση που ο χρήστης του site έχει δικαιώματα full control σε διαφορετική περίπτωση μου επιστρέφει μήνυμα Access to the path .....  is denied. .zz1_TopNavigationMenu_0 { background-color:white;visibility:hidden;display:none;position:absolute;left:0px;top:0px; } .zz1_TopNavigationMenu_1 { text-decoration:none; } .zz1_TopNavigationMenu_2 { } .zz1_TopNavigationMenu_3 { border-style:none; } .zz1_TopNavigationMenu_4 { } .zz1_TopNavigationMenu_5 { } .zz1_TopNavigationMenu_6 { border-style:none; } .zz1_TopNavigationMenu_7 { } .zz1_TopNavigationMenu_8 { background-color:#F2F3F4;border-color:#A7B4CE;border-width:1px;border-style:solid; } .zz1_TopNavigationMenu_9 { border-style:none; } .zz1_TopNavigationMenu_10 { } .zz1_TopNavigationMenu_11 { border-style:none; } .zz1_TopNavigationMenu_12 { } .zz1_TopNavigationMenu_13 { border-style:none; } .zz1_TopNavigationMenu_14 { } .zz1_TopNavigationMenu_15 { border-style:none; } .zz1_TopNavigationMenu_16 { background-color:#CBE3F0; } .zz2_QuickLaunchMenu_0 { background-color:white;visibility:hidden;display:none;position:absolute;left:0px;top:0px; } .zz2_QuickLaunchMenu_1 { text-decoration:none; } .zz2_QuickLaunchMenu_2 { } .zz2_QuickLaunchMenu_3 { border-style:none; } .zz2_QuickLaunchMenu_4 { } .zz2_QuickLaunchMenu_5 { border-style:none; } .zz2_QuickLaunchMenu_6 { } .zz2_QuickLaunchMenu_7 { } .zz2_QuickLaunchMenu_8 { } .zz2_QuickLaunchMenu_9 { border-style:none; } .zz2_QuickLaunchMenu_10 { } .zz2_QuickLaunchMenu_11 { border-style:none; } .zz2_QuickLaunchMenu_12 { } .
    πως μπορώ να το λύσω αυτό προγραμματιστικά χωρίς να αλλαχθούν δικαιώματα στο site ή στο security του folder του server;;

    Ευχαριστώ εκ των προτέρων.

  •  01-12-2008, 17:32 46612 σε απάντηση της 46609

    Απ: Πρόβλημα με δικαιώματα Sharepoint

    μηπως μπορεις να αναφέρεις ποια στιγμή κανεις το impersonation και πως (αν μπορεις βαλε και το καμματι του κωδικα)


    Don't try to argue with the machine
    Elias Markelis
    MCPD,MCT
  •  01-12-2008, 20:19 46618 σε απάντηση της 46609

    Απ: Πρόβλημα με δικαιώματα Sharepoint

    Μετέφερα τη συζήτηση εδώ, καθώς το θέμα έχει να κάνει ξεκάθαρα με ... Sharepoint. Καταρχήν, το Sharepoint χρησιμοποιεί σχεδόν παντού impersonation για να τρέξει τον κώδικα μόνο με τα περιορισμένα permissions του client. Η ρύθμιση αυτή μπαίνει αυτόματα όταν δημιουργείται ένα νέο web application. Το Sharepoint βασίζεται σε αυτό, οπότε κάθε αλλαγή π.χ. από το app.config απαγορεύεται αυστηρώς και δια ροπάλου.

    Για να τρέξει κανείς κώδικα με elevated priviledges πρέπει να εκτελέσει τον κώδικα του ως εξής:

    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
    // do things assuming the permission of the "system account"
    });

    Εδώ υπάρχει και μία μικρή παγίδα για όποιον θέλει με κώδικα να πειράξει τα περιεχόμενα του Sharepoint. Για να έχει κανείς elevated priviledges όταν πειράξει sites, λίστες και αντικείμενα, θα πρέπει τα αντίστοιχα αντικείμενα να έχουν δημιουργηθεί μέσα στο RunWithElevatedPrivileges. Αυτό σημαίνει ότι ΔΕΝ μπορούμε να χρησιμοποιήσουμε π.χ. το SPContext.Current.Site αν θέλουμε να πειράξουμε τα περιεχόμενα ενός site. Θα πρέπει να γράψουμε κάτι σαν το

    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
    using (SPSite site = new SPSite(SPContext.Current.Site.ID))
    {
    // do things assuming the permission of the "system account"
    }
    });

    Danger, Danger, Will Robinson!

    Χρειάζεται μεγάλη προσοχή όμως. Καταρχήν, το Sharepoint έχει φτιαχτεί με τη λογική ότι ο κώδικας δεν έχει άμεση πρόσβαση στη βάση ή τον σκληρό. Λογικά, ΔΕΝ πρέπει να φτιάχνει ή να διαγράφει κανείς folder στον σκληρό.

    Επιπλέον, ακόμα και μία custom ASPX σελίδα δεν θα πρέπει να έχει δικαίωμα να εκτελέσει custom κώδικα! Μπορεί να περιέχει κάποια Safe controls, αλλά δεν μπορεί να τρέξει .NET κώδικα. Αυτό γίνεται για να αποφευχθούν επιθέσεις οι οποίες θα καταφέρουν να εκτελέσουν κώδικα με administrator priviledges.
    Οπότε, είτε η Eua έχει γράψει κάποιο Web Part, ή "κάρφωσε" το app.config ένα SafeControl entry στο app.Config. Αυτό είναι ΚΑΚΟ. Πέρα από ότι είναι ΚΑΚΟ, είναι και ΜΠΕΛΑΣ και κακή συνήθεια, γιατί ένα site μπορεί να έχει δεκάδες subsites και εκατοντάδες custom σελίδες. Στο τέλος θα καταλήξουμε να έχουμε εκατοντάδες entires στο SafeControls. Άντε μετά να βγάλεις άκρη, ποιό είναι όντως ασφαλές και ποιό όχι!

    Υποψιάζομαι λοιπόν, ότι η Eua έχει κάποιο άλλο πρόβλημα το οποίο προσπαθεί να το λύσει δημιουργώντας temporary folders στο σκληρό. Κατά πάσα πιθανότητα αυτό είναι περιττό, οπότε καλό θα είναι να μας πει η Eua τί προσπαθεί να κάνει για να βρούμε μία καλύτερη λύση


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-12-2008, 09:05 46633 σε απάντηση της 46618

    Απ: Πρόβλημα με δικαιώματα Sharepoint

    Λοιπόν, αρχικά να πω ότι γράφω σε Sharepoint designer και συνεχίζω..

    καταλαβαίνω ότι δεν είναι ασφαλές όπως είπε και ο Παναγιώτης να αποθηκεύω στο σκληρό όμως είναι απαραίτητο. Πρόκειται για μια Workflow εφαρμογή και μετά από τις απαραίτητες εγκρίσεις παράγω αρχείο το οποίο  αποθηκεύω και στον Server για να το  λάβει εξωτερική εφαρμογή. Δυστυχώς είναι απαραίτητο και δεν μπορεί να αποφευχθεί. Όσο για τον κώδικα  σας τον παραθέτω για να μου προτείνετε τροποποιήσεις:

    protected void Send_Again(object sender, EventArgs e)
     {
     
        
    //ανοίγω το site με δικαιώματα admin

      SPUser Actionuser = SPContext.Current.Web.AllUsers[ConfigurationManager.AppSettings.Get("SiteAdmin")];
      SPUserToken token = Actionuser.UserToken;
         using (SPWeb site = new SPSite(SPContext.Current.Web.Url,token).OpenWeb())
      {
       try
          {   site.AllowUnsafeUpdates = true;
            
        SPListItemCollection listcol = site.Lists["fax"].Items;         
              SPListItem faxlitem = listcol[new Guid(Request["id"].ToString())];
             
             
                  //Failed dir
                      string FailedDir = @"c:\Fax_Approved\Failed";
                  
    //τελικός φάκελος αποθήκευσης

                string lastDir = @"c:\Fax_Approved";
           //Δημιούργησε ένα Subfolder του παραπάνω φακέλου

                string lastPath = System.IO.Path.Combine(lastDir,"fax"+faxlitem["ID"].ToString()+"_"+faxlitem["FaxNo"].ToString());
                   DirectoryInfo  subfolder = new DirectoryInfo(lastPath);
                if(!subfolder.Exists)
                System.IO.Directory.CreateDirectory(lastPath);
                string newPath = System.IO.Path.Combine(FailedDir,  "fax"+faxlitem["ID"].ToString()+"_"+faxlitem["FaxNo"].ToString());
              //Κάνε Copy των φάκελο και επικόλλησε τον στο τελικό directory προς αποστολή
            if (System.IO.Directory.Exists(newPath))
                  {
         
                   string[] files = System.IO.Directory.GetFiles(newPath);

                   // Copy the files and overwrite destination files if they already exist.
                   foreach (string s in files)
                   {
                       // Use static Path methods to extract only the file name from the path.
                       string fileName = System.IO.Path.GetFileName(s);
                       string destFile = System.IO.Path.Combine(lastPath, fileName);
                       System.IO.File.Copy(s,destFile, true);
                   }
                       System.IO.Directory.Delete(newPath,true);
                                    
               }
              
         }
        
       catch (Exception ex){
           ClientScript.RegisterClientScriptBlock(this.GetType(), "onload", "alert('Πρόβλημα: " + ex.Message + "')", true);          }
             
           }

    Οι εντολές για create,copy folder/files παίζουν στο delete έχω error..

    Ευχαριστώ για τη βοήθεια.


     

     

  •  02-12-2008, 11:19 46638 σε απάντηση της 46633

    Απ: Πρόβλημα με δικαιώματα Sharepoint

    Προσωπικά, θα προτίμουσα να κάνω το debug σε άλλο επίπεδο - θα προσπαθούσα να δω με τι credentials φτάνει το process στο folder την ώρα που πάει να σβήσει το folder. Ένα τέτοιου είδους debugging είναι πιο απλό και άμεσο. Θα μπορούσε να χρησιμοποιήσεις το Process Monitor ένα εργαλείο που σου επιτρέπει να δεις "live" τι συμβαίνει στον υπολογιστή σου. Αν τρέξει αυτό επάνω στο server που γίνονται οι αλλαγές στο folder, θα δεις γιατί δεν μπορεί να σβήσει το folder.

    Ο site admin δεν έχει - σώνει και καλά - δικαιώματα στο server, μπορεί να είναι και απλός χρήστης. Το πιθανότερο, είναι να φτάνει το process, μέσα στο folder με τα δικαιώματα που τρέχει ο SharePoint αν και να έχει δικαιώματα create/read να μην έχει delete...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  02-12-2008, 11:40 46640 σε απάντηση της 46638

    Απ: Πρόβλημα με δικαιώματα Sharepoint

    Ο site Admin είναι και local admin στον server για αυτό χρησιμoποιώ τα δικαιώματα του στον κώδικα. Κάτι που είναι πολύ περίεργο..  Το σκέφτηκα και εγώ ότι μπορεί να φταίνε τα δικαιώματα στον Server και υπέθεσα ότι το Token που χρησιμοποιώ μπορεί να έχει σχέση μόνο με το site και όχι στον server έτσι  δοκίμασα τα εξής :

    1. να κάνω έναν Simple User (στο Sharepoint και στο Server) να έχει full control στον server και τότε έσβησε το φάκελο ,τότε υπέθεσα ότι ήταν θέμα του Server
        αυτό δεν μπορώ να το κάνω για όλους τους χρήστες της εταιρίας όπως καταλαβαίνεται γιατί έχω πρόβλημα με τον Admin..

      όμως στην συνέχεια έκανα το εξής..

        2. σε έναν Simple user του Sharepoint (δικαιώματα Read) έδωσα Full control στο Sharepoint και το έσβησε αν και δεν είχε ο χρήστης δικαιώματα στον Server! αυτό είναι κάτι που μου έκανε εντύπωση ενώ είχα καταλήξει ότι ήταν θέμα με τα δικαιώματα στον Server.

    πραγματικά δεν καταλαβαίνω... 


  •  02-12-2008, 12:41 46641 σε απάντηση της 46633

    Απ: Πρόβλημα με δικαιώματα Sharepoint

    Καταρχήν, αυτό που κάνεις είναι πολύ, ΠΟΛΥ ΣΟΒΑΡΟ πρόβλημα ασφάλειας. Εδώ δεν χωράει το "ναι μεν, αλλά πρέπει". Όπως έχεις εσύ πρόσβαση στην σελίδα μέσω Sharepoint, έχουν και οι χρήστες σου. Από τη στιγμή που έβαλες τη σελίδα στο SafeControls κάποιος από τους πελάτες σου μπορεί να πάει εκεί και να βάλει ό,τι χαζό κώδικα θέλει. Όπως π.χ. να βάλει κώδικα ανοικτό σε script injections. Ή κώδικα ο οποίος θα διαβάζει λίστες και σελίδες που έχεις κρύψει. Ή μία γραμματέας της οποίας είπαν να πάει να φτιάξει μία σελίδα με το "νέο Frontpage". Ή, ή, ή. Μιλάμε για κάτι σαν Bad Sharepoint Practice #3.

    Άσε, που όπως είδες και εσύ, το debugging γίνεται μανίκι.

    Το λέω με τον απαιτούμενο σεβασμό, γνωρίζοντας ότι έχει τσαντίσει πολύ κόσμο στα newsgroups, και γνωρίζοντας ότι είναι ευκολότερο να κάνεις τη χακιά παρά να μπεις στη λογική του Sharepoint αλλά ... πρέπει να καταλάβεις τη λογική του Sharepoint, ιδιαίτερα πριν κάνεις τόσο δραστικές αλλαγές. Δυστυχώς, το Sharepoint είναι εύκολο για τους τελικούς χρήστες αλλά δύσκολο για τους developers. Γι αυτό και τελικά δεν υπάρχουν Sharepoint Experts, απλά άνθρωποι οι οποίοι έχουν λύσει τα προβλήματα πριν από εσένα.

    Σχετικά με το δικό σου θέμα, αφού μιλάμε για workflow θα έπρεπε να ψάχνεις για τρόπους να υλοποιήσεις το workflow. Το Sharepoint έχει το δικό του workflow το οποίο μπορείς να σχεδιάσεις και μέσω Sharepoint Designer, ενώ μπορείς να χρησιμοποιήσεις και Event Receivers αν θέλεις να δουλέψεις μόνο με κώδικα. Κανονικά θα έπρεπε να κοιτάζεις για κάποιο workflow activity το οποίο να αποθηκεύει το αρχείο στο σκληρό και όχι πως να κάνεις το ίδιο πράγμα μέσα στην σελίδα. Υπάρχουν ήδη αρκετά projects στο Codeplex με custom activities, όπως το Useful Sharepoint Designer Custom Workflow Activities το οποίο έχω χρησιμοποιήσει πολύ συχνά. Δεν έχει κάποιο έτοιμο activity για Save to Disk, αλλά μπορείς να το χρησιμοποιήσεις σαν βάση για να φτιάξεις τα δικά σου activities. Για παράδειγμα, τα Send Email with Attachment activities ήδη κάνουν κάποια από τα βήματα που θέλεις κι εσύ,

    Όσον αφορά τον κώδικα σου, πουθενά δεν καλείς την RunWithElevatedPrivileges, οπότε δεν υπάρχει περίπτωση να τρέξει ο κώδικας με Admin rights. Μπορεί να άνοιξες το site με το token του Admin, αλλά εσύ δεν θέλεις να δουλέψεις με το site. Θέλεις να δουλέψεις με το σκληρό δίσκο. Πρέπει ο κώδικας σου  να τρέξει ως admin, όχι να μιλήσεις στο site ως admin. Για να δουλέψει το Delete θα πρέπει να γράψεις

    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
    System.IO.Directory.Delete(newPath,true);
    });

    αλλιώς δεν πρόκειται να τρέξει ως System Account. Αν όμως θέλεις όντως να διαβάσεις τα περιεχόμενα της λίστας ως System Account, θα πρέπει να βάλεις και τον υπόλοιπο κώδικα μέσα στην RunWithElevatedPrivileges:

    SPSecurity.RunWithElevatedPrivileges(delegate()
    {
    using(SPSite site=new SPSite(SPContext.Current.Site.ID))
    using (SPWeb web = site.OpenWeb())
    {
      .......
      SPListItemCollection listcol = web.Lists["fax"].Items;
      SPListItem faxlitem = listcol[new Guid(Request["id"].ToString())];
      .....
      System.IO.Directory.Delete(newPath,true);
    }
    });

    Στο ξαναλέω όμως, ΜΗΝ ΧΡΗΣΙΜΟΠΟΙΗΣΕΙΣ αυτό τον κώδικα. Είναι πολύ κακή ιδέα να τρέχεις κώδικα μέσα στις σελίδες του Sharepoint.

    Μερικές παρατηρήσεις ακόμα. Άλλο το site, άλλο το web. Δεν πρέπει να μπλέκεις τα ονόματα μεταξύ τους γιατί διαφορετικά θα μπλέξεις. Επίσης, η web.AllowUnsafeUpdates είναι επικίνδυνη και δεν πρέπει να τη χρησιμοποιείς αν δεν είσαι σίγουρη γι αυτό που κάνεις ... ειδικά αν δεν κάνεις ΚΑΝΕΝΑ update! Αφού τη χρησιμοποιήσεις θα πρέπει πάντα να την ξανακάνεις false. Λογικά αν χρειαζόταν, θα έπρεπε να την βάλεις σε ένα try .. finally block.

    Τέλος, θυμήσου αυτό που έγραψα και νωρίτερα. Το Sharepoint είναι δύσκολο και έχει μανικάκια, ειδικά όταν ξεκινάς με αυτό. Αν δεν θέλεις να μάθεις τί σημαίνει η έκφραση "Υπάρχουν κροκόδειλοι στη μπανιέρα μου", ζήτα βοήθεια από κάποιον έμπειρο έγκαιρα, πριν δεσμευτείς στον προϊστάμενο ή τον πελάτη σου ότι θα έχεις παραδώσει κάτι σε μία συγκεκριμένη ημερομηνία.
    Στη δική σου το πρόβλημα δεν είναι το πως να γράψεις στο σκληρό από μία σελίδα, αλλά πως θα κάνεις το Sharepoint να επικοινωνήσει με ένα άλλο σύστημα και μάλιστα στα πλαίσια ενός workflow. Το Sharepoint έχει μηχανισμούς που μπορούν να το κάνουν αυτό χωρίς να δημιουργήσεις προβλήματα ασφαλείας ή συντήρησης στο μέλλον.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-12-2008, 12:59 46642 σε απάντηση της 46640

    Απ: Πρόβλημα με δικαιώματα Sharepoint

    Εξακολουθείς να κοιτάς πράγματα τα οποία δεν έχουν σχέση με το πρόβλημα σου. Τα permissions των χρηστών στα site του Sharepoint δεν έχουν σχέση καταρχήν με τα permissions στο σύστημα. Επιπλέον, ο κώδικας στις σελίδες τρέχει πάντα με τα permission του τελικού χρήστη. Ο μόνος τρόπος να τρέξεις κώδικα με αυξημένα δικαιώματα είναι η RunWithElevatedPrivileges.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  02-12-2008, 14:30 46646 σε απάντηση της 46641

    Απ: Πρόβλημα με δικαιώματα Sharepoint

    Χωρίς να θέλω να το παίξω έξυπνος μιας και δεν έχω και την τεράστια πείρα στο SharePoint, δεν ξέρω κατά πόσο θα μπορούσες να προσεγγίσεις αυτό που θέλεις με την χρήση ενός web service που θα κάνει αυτή και μόνο αυτή την εργασία.

    Νομίζω ότι με αυτό τον τρόπο δεν θα χρειαστεί να παίξεις με τα δικαιώματα μέσα από το SharePoint αλλά ταυτόχρονα αν χρειαστείς να κάνεις impersonation θα το κάνεις με μεγαλύτερη ασφάλεια.

    Θα ήθελα να  ακούσω και την άποψη των υπολοίπων σε αυτή την λογική προσέγγισης.


    Don't try to argue with the machine
    Elias Markelis
    MCPD,MCT
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems