SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Impersonation Problem beim Erzeugen eines SPSite Objects

Unbeantwortet Dieser Beitrag hat 3 Antworten

Ohne Rang
9 Beiträge
Eric Bachmann erstellt 11 Aug. 2010 12:10
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo liebe Community,

Auf mehrfache Empfehlung habe ich es nun endlich geschafft mich Hier anzumelden und ich habe natürlich auch gleich eine erste Frage :-)

Unten stehende kleine Konsolenanwendung soll (zu Testzwecken) ein UserProfile-Property für einen statisch festgelegten User auslesen und neu setzen. Dies soll unabhängig von den Benutzerrechten des aktuell angemeldeten User funktionieren.

Zu diesem Zweck wollte ich Windows Impersonation verwenden. Diese scheint auch zunächst zu funktionieren, jedoch sobald ich das neue SPSite-Objekt erzeugen will erhalte ich eine FileNotFoundException. Der Event-Log des Servers teilt mir mit, dass der urpsrünglich angemeldete User sich nicht  auf der Config-Datenbank anmelden kann (was auch ok ist). So fern ich auf dem Server mit einem Account angmeldet bin, der auch in SP über Admin-Rechte funktioniert das (hat ja auch die notwendigen Rechte auf der Config-DB).

Hat jemand eine Idee warum SP die Impersonation ignoriert? Ich hatte es zuvor mit:

SPSecurity.RunWithElevatedPrivileges(delegate()
{
//Code
});

versucht, aber dann erhielt ich eine NullPointerException und den gleichen Eintrag im Event-Log.

Kann mir jmd. sagen was ich falsch mache oder hat sonst eine Idee wie eine Impersination in SP funktioniert?

Hier nun der Code:

namespace ConsoleApplication1
{
    class Program
    {
        public const int LOGON32_LOGON_INTERACTIVE = 2;
        public const int LOGON32_LOGON_SERVICE = 3;
        public const int LOGON32_PROVIDER_DEFAULT = 0;

        [DllImport("advapi32.dll", CharSet = CharSet.Auto)]
        public static extern bool LogonUser(
          String lpszUserName,
          String lpszDomain,
          String lpszPassword,
          int dwLogonType,
          int dwLogonProvider,
          ref IntPtr phToken
        );

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


        static void Main(string[] args)
        {
            IntPtr userHandle = new IntPtr(0);
            string user = "ADMIN";
            string userDomain = "DOMAIN";
            string password = "PW";
           
            LogonUser(
                user,
                userDomain,
                password,
                LOGON32_LOGON_INTERACTIVE,
                LOGON32_PROVIDER_DEFAULT,
                ref userHandle
             );

            Console.WriteLine(WindowsIdentity.GetCurrent().Name);
            WindowsIdentity newId = new WindowsIdentity(userHandle);
            WindowsImpersonationContext impersonatedUser = newId.Impersonate();
            Console.WriteLine(WindowsIdentity.GetCurrent().Name);

            //NetworkCredential MyCredentials = new NetworkCredential(user, password, userDomain);

            NetworkCredential MyCredentials = CredentialCache.DefaultNetworkCredentials;
            MyCredentials.UserName = user;
            MyCredentials.Password = password;
            MyCredentials.Domain = userDomain;
            Console.WriteLine(MyCredentials.UserName);

            string siteURL = "http://muc-sptstidx-01";

            Console.WriteLine(WindowsIdentity.GetCurrent().Name);
            using (SPSite site = new SPSite(siteURL))
            {
                ServerContext serverContext = ServerContext.GetContext(site);
                UserProfileManager spUserProfileManager = new UserProfileManager(serverContext);
                UserProfile spUserProfile = spUserProfileManager.GetUserProfile("DOMAIN\\STATIC-USER");

                Console.WriteLine(spUserProfile["Silverlight"].Value);
                spUserProfile["Silverlight"].Value = Console.ReadLine();
                Console.WriteLine(spUserProfile["Silverlight"].Value);
                spUserProfile.Commit();
            }
        }
    }
}

Danke für jede Hilfe!

Viele Grüße,

Eric

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 11 Aug. 2010 12:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Eric und willkommen :-)

SPSite hat einen Konstruktor, der nicht nur die URL sondern auch ein UserToken aufnimmt. Übergib diesem das Token der WindowsIdentity.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
9 Beiträge
Eric Bachmann Als Antwort am 11 Aug. 2010 13:14
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi,

Vielen Dank für die schnelle Antwort!

Der Konstruktor nimmt leider nur Objekte vom Typ SPUserToken und nicht System.IntPtr. Ich habe auch noch keine Möglichkeit gefunden aus dem einen das andere zu Erzeugen, es sei denn ich habe ein SPSite Objekt womit ich wieder vor dem originären Problem stehe :-)

Viele Grüße,

Eric

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 11 Aug. 2010 13:49
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Da hast Du wohl recht und von daher sehe ich keine Möglichkeit eine Konsolenanwendung unter einem anderen Benutzer auszuführen (außer über runas).

Viele Grüße
Andi
af @ evocom de
Blog