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

 

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

Κλήση εφαρμογής HTA με custom user credentials (run as) (.NET 1.1) χωρίς φυσική ύπαρξη του αρχείου στο δίσκο. Γινεται;

Îåêßíçóå áðü ôï ìÝëïò cap. Τελευταία δημοσίευση από το μέλος KelMan στις 27-02-2006, 20:18. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  24-02-2006, 14:00 10085

    Κλήση εφαρμογής HTA με custom user credentials (run as) (.NET 1.1) χωρίς φυσική ύπαρξη του αρχείου στο δίσκο. Γινεται;

    Το δημοσιεύω σε αυτή την περιοχή επειδή "πιάνει" διάφορους άλλους τομείς.

    Παλιότερα είχα γράψει ένα άρθρο για το πως μπορεί κανείς στο .NET 1.1 να καλέσει μια εφαρμογή με custom user credentials, μιμούμενος ουσιαστικά τη λειτουργία "run as" των Windows. Προκύπτει λοιπόν σήμερα η εξής ανάγκη:

    Θέλω να φωνάζω ένα html application (.HTA αρχείο) με custom user credentials και, ει δυνατόν, το αρχείο αυτό να ΜΗΝ υπάρχει στο δίσκο. Να δημιουργείται από το calling application εκείνη τη στιγμή. Θα μου πειτε "καλα, ευκολο, το φτιάχνεις, το φωνάζεις, το σβήνεις (κάποτε)". Αμ δε!

    Εγώ θα ήθελα να μην υπάρξει ΠΟΤΕ το αρχείο αυτό στο δίσκο, αλλά να δημιουργείται και να αποστέλλεται από το calling app. Προσοχή, πρέπει να τρέξει η όλη "απάτη" σε .net 1.1 και για μιμηση του "run as" απαιτείται κάποιο api call το οποίο παίρνει PATH αρχειου. Ξερω οτι μπορεί να είναι αδύνατο να επιτευχθεί κάτι τέτοιο, αλλά ήθελα και την γνώμη σας μπας και κάτι μου ξεφεύγει.

    Αν θέλετε να ξέρετε γιατί HTA, θα είναι το front-end για να χτυπήσει κάποιος ένα Sql Report Server κάτω από συγκεκριμένα user credentials.

    EDIT: Μια σκέψη που μου ήρθε εκ των υστέρων για τμηματική υλοποίηση ειναι η εξής πιθανή:

    1. Κατασκευή μιας stand-alone winforms εφαρμογής η οποία με κάποιο τρόπο θα κάνει generate και θα φωνάζει το αρχείο

    2. Χρηση του api call για την κλήση της παραπάνω εφαρμογής από την δική μου.

    Και σε αυτή την περίπτωση όμως, αν είναι βιώσιμη, υπάρχει το πρόβλημα του generate και της κλήσης του αρχείου, όπως περιγράφεται στο (1), το οποίο πρέπει να επιλυθεί. Υπόψιν οτι δεν θα χρησιμοποιηθεί webbrowser control, μια και το αρχείο θα είναι .hta.

    Δυσκολα σας έβαλα; :)

     

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  24-02-2006, 16:58 10095 σε απάντηση της 10085

    Απ: Κλήση εφαρμογής HTA με custom user credentials (run as) (.NET 1.1) χωρίς φυσική ύπαρξη του αρχείου στο δίσκο. Γινεται;

    Τα αρχεία hta δεν είναι εκτελέσιμα για να κάνεις CreateProcess σε αυτά, αλλά μόνο ShellExecute. Το εκτελέσιμο που τα τρέχει είναι το mshta.exe στο οποίο δίνεις στο command line το όνομα του hta.

    Μια ιδέα που δεν ξέρω αν θα δουλέψει είναι η ακόλουθη:

    • Ανοίγεις ένα named pipe και γράφεις τα περιεχόμενα του hta εκεί.
    • Κάνεις CreateProcess το mshta.exe και του δίνεις για όρισμα το όνομα του named pipe.

    Επειδή τα named pipes τα χειριζόμαστε με τα ίδια API calls όπως και τα αρχεία (CreateFile, ReadFile, WriteFile), μπορεί να "ξεγελάσεις" το mshta και να διαβάσει τα περιεχόμενα του hta από εκεί. Αυτό που δεν μπορώ να σκεφτώ είναι πότε θα κλείνεις το named pipe.

     


    Νατάσα Μανουσοπούλου
  •  24-02-2006, 17:09 10096 σε απάντηση της 10095

    Απ: Κλήση εφαρμογής HTA με custom user credentials (run as) (.NET 1.1) χωρίς φυσική ύπαρξη του αρχείου στο δίσκο. Γινεται;

    Ενδιαφέρον. Εχω βαλει κατω μερικές εναλλακτικές, θα επιχειρήσω να κάνω μια δοκιμή και με την πρότασή σου.

    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  24-02-2006, 18:47 10104 σε απάντηση της 10085

    Απ: Κλήση εφαρμογής HTA με custom user credentials (run as) (.NET 1.1) χωρίς φυσική ύπαρξη του αρχείου στο δίσκο. Γινεται;

    Το ίδιο μπορείς να κάνεις και με memory streams.
    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
  •  24-02-2006, 19:34 10108 σε απάντηση της 10104

    Απ: Κλήση εφαρμογής HTA με custom user credentials (run as) (.NET 1.1) χωρίς φυσική ύπαρξη του αρχείου στο δίσκο. Γινεται;

    Λοιπον, εστω και εκπαιδευτικά έχει ιδιαίτερο ενδιαφέρον.
    Η πρόταση για το named pipe πήγε λίγο πιό πίσω στο queue λόγω επικράτησης άλλων εναλλακτικών, αλλά παραμένει μια ενδιαφέρουσα πρόταση και υπόσχομαι να τη δοκιμάσω.

    Μια άλλη πρόταση (την οποία δέχτηκα από τον kelman σε chat) ήταν να ενσωματώσω ένα WebBrowser control σε δική μου φόρμα και να χρησιμοποιώ το api call για να κάνω run as ουσιαστικά τη δική μου φόρμα (η οποία θα έχει τη μορφή αυτόνομης εφαρμογής). Την βρήκα ελκυστική και εύκολη σαν πρόταση, και έτσι έκανα μια δοκιμαστική υλοποίηση.

    Βρηκα λίγο δύσκολο το να απενεργοποιήσω το δεξί κλικ (βασικά, υπάρχουν δεκάδες τρόποι να το κάνεις, ο ένας λίγο...χειρότερος από τον άλλον). Κατά πάσα πιθανότητα θα παίξει έτσι, οπότε δεν θα χρειαστεί HTA. Stay tuned παντως, πρώτον γιατί είναι ενδιαφέρον θέμα και δεύτερον γιατί αν δείξει οτι δεν καλύπτει τα ζητούμενα θα παμε για streams, pipes και τα λοιπά προηγμένα στα σίγουρα :)


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  27-02-2006, 17:53 10224 σε απάντηση της 10108

    Απ: Κλήση εφαρμογής HTA με custom user credentials (run as) (.NET 1.1) χωρίς φυσική ύπαρξη του αρχείου στο δίσκο. Γινεται;

    Λοιπον κατόπιν νεώτερης μελέτης κλείνω αυτό το thread ως επιλυμένο, παρ'όλο που δεν ακολούθησα τις συμβουλές σας. Η βοήθειά σας πάντως ήταν πολύτιμη μια και μου έδειξε κάποιες κατευθύνσεις.

    Το πρόβλημα, σε ένα extent, λύνεται με την λογική της ενσωμάτωσης ενός webbrowser control σε μια φόρμα και τη δημιουργία ενός αυτόνομου executable με βάση αυτή τη φόρμα. Η calling application θα καλέσει αυτό ως process με credentials που θα "παίζουν", και έτσι λύνεται το θέμα του security (στο επίπεδο που ζητείται στο παρόν έργο).

    Το ενδιαφέρον εδώ ήταν πως θα μπορούσα να "μπλοκάρω" οτιδήποτε ερχόταν στο webbrowser control (ctrl-n, ctrl-p, διάφορα άλλα πράγματα όπως το δεξί κλικ). Εκεί είχα δύο επιλογές: Να παίξω με τα events του browser control (δυσκολα, ασχημα, και πράγματα όπως το onContextMenu δεν δουλεύουν καλά σε framed σελίδες), ή να παίξω με τα events της φόρμας. Επέλεξα το δεύτερο.

    Βρισκοντας κάποιο κώδικα και αλλάζοντάς τον αρκετά ωστε να κάνει αυτό που ήθελα, κατάφερα να έχω drag/drop, pageup/down και να μπλοκάρω όλα τα άλλα πράγματα ακολουθώντας μια restrictive πολιτική. Για να το κάνω έπρεπε η φόρμα μου να κάνει implement το IMessageFilter interface και να υλοποιήσει τη μέθοδο PreFilterMessage. Η μέθοδος αυτή "φιλτράρει" όλα τα μηνύματα που έρχονται στο παραθύρι πριν τα κάνει dispatch εκεί που πρέπει να πάνε. Αρα λοιπον μπορεί κανείς με αυτό τον τρόπο να "κόψει" μηνύματα όπως το δεξί κλικ για να μην φτασουν παρακάτω.

    Η μέθοδος είναι boolean και οταν επιστρέφει FALSE δηλώνει οτι το μήνυμα θα τύχει περαιτέρω χειρισμού. Αν επιστρέψει TRUE, τότε το μήνυμα μπλοκάρεται εντός αυτού του σημείου. Παραθέτω τον κώδικα που χρησιμοποίησα, ο οποίος φιλτράρει για συγκεκριμένους τύπους events και μετά χρησιμοποιεί restriction, αφήνοντας να περάσουν μόνο τα επιθυμητά.

    Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) _
            As Boolean Implements IMessageFilter.PreFilterMessage

            'We watch for the following events:
            ' x100 (WM_KEYDOWN)
            ' x101 (WM_KEYUP) 
            ' x104 (WM_SYSKEYDOWN)
            ' x200 (WM_MOUSEMOVE)
            ' x204 (WM_RBUTTONDOWN)
            ' x205 (WM_RBUTTONUP)
            ' x206 (WM_RBUTTONDBLCLK)
            ' x207 (WM_MBUTTONDOWN)
            ' x208 (WM_MBUTTONUP)
            ' x209 (WM_MBUTTONDBLCLK)

            'We don't watch for WM_LBUTTON events (201-203) since these must pass as is.
            'So we handle everything transparently except from those things refered above:

            If Not ( _
                        m.Msg = &H100 _
                        Or m.Msg = &H101 _
                        Or m.Msg = &H104 _
                        Or m.Msg = &H204 _
                        Or m.Msg = &H205 _
                        Or m.Msg = &H206 _
                        Or m.Msg = &H207 _
                        Or m.Msg = &H208 _
                        Or m.Msg = &H209 _
                    ) Then

                'Let the event be passed further on
                Return False

            End If

            'Find the key code
            Dim keyCode As Keys = CType(m.WParam.ToInt32(), Keys) And Keys.KeyCode

            'Here we follow a restrictive approach, letting only the keystrokes
            'that interest us pass. Everything else is stopped.
            Select Case keyCode

                Case Keys.Down
                    Return False
                Case Keys.Up
                    Return False
                Case Keys.PageDown, Keys.PageUp
                    Return False
                Case Else
                    'Block everything else!
                    Return True
            End Select

        End Function

    Φυσικά, ίσως δεν είναι η καλύτερη υλοποίηση, αν υπάρχουν σχόλια πολύ ευχαρίστως να τα ακούσω.

    Ξερω οτι φύγαμε εκτος του αρχικού θέματος, αλλά τελικά έτσι λύθηκε το θέμα :)

     

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  27-02-2006, 20:18 10226 σε απάντηση της 10085

    Απ: Κλήση εφαρμογής HTA με custom user credentials (run as) (.NET 1.1) χωρίς φυσική ύπαρξη του αρχείου στο δίσκο. Γινεται;

    Μπράβο! Yes [Y] Εγώ είχα αντίστοιχο κώδικα για VB6 που έπαιζε με API Calls πάνω στο WebBrowser control. Όντως ήταν αρκετά δύσκολος στην υλοποίηση (ιδιαίτερα για να περάσει και σε VB.NET) γιατί έπρεπε να κάνεις ένα σωρό μαϊμουδιές πχ για να δουλεύει σωστά με frames, για να πάρεις το handle του web broweser control (ο γνωστός τρόπος δεν δουλέυει, πρέπει να κάνεις iteration σε όλα τα windows), κλπ
    Το alternative που παραθέτεις είναι σαφώς καλύτερο, μπαίνει στη βιβλιοθήκη μου Wink [;)]
    Vir prudens non contra ventum mingit
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems