Avatar billede muppet Nybegynder
19. februar 2004 - 10:09 Der er 19 kommentarer

Active Directory fra WebService

Hej alle

Jeg sidder og har kørt en del eksempler igennem hvor jeg tilgår Active Directory gennem en WebService, men jeg får hele tiden samme fejl.
Jeg har prøvet at lave programmet i alm. Windows Forms og der virker det. Jeg har altså fundet ud af hvordan det gøres, så det er ikke det der er problemet.

Er der noget jeg har overset mht. rettigheder/adgang/etc igennem en WebService i fht. alm. Windows platform

Mvh.
- Muppet
Avatar billede muppet Nybegynder
19. februar 2004 - 10:11 #1
Burde måske lige delagtiggøre i fejlmeddelelsen:

System.Runtime.InteropServices.COMException (0x8007054B): The specified domain either does not exist or could not be contacted

Den får jeg ikke gennem alm. Windows Forms, så domænet er korrekt nok...
Avatar billede burningice Nybegynder
19. februar 2004 - 10:11 #2
måske en ide at sige hvilken fejl du får?
Avatar billede muppet Nybegynder
19. februar 2004 - 10:12 #3
:oP
Nåede det ... hehe
Avatar billede burningice Nybegynder
19. februar 2004 - 10:18 #4
kører webservicen på samme computer som windows-programmet har virket på?
Avatar billede muppet Nybegynder
19. februar 2004 - 10:19 #5
Ja
Avatar billede burningice Nybegynder
19. februar 2004 - 10:22 #6
har du sørget for at din webservice kører under en account der har tilladelse til at tilgå domænet?
Avatar billede muppet Nybegynder
19. februar 2004 - 10:24 #7
Ja
Avatar billede muppet Nybegynder
19. februar 2004 - 10:25 #8
Samme account som den alm. windows applikation benytter
Avatar billede burningice Nybegynder
19. februar 2004 - 10:28 #9
Avatar billede muppet Nybegynder
19. februar 2004 - 10:38 #10
I forhold til den ovenstående artikel, hvad skal den følgende sti så ændres til:
sAdsiPath = "LDAP://rootDSE"

Med andre ord, hvad betyder dcname, hvad er 'Dc=' i:
sAdsiPath = "LDAP://dcname/Dc=xxx,Dc=yyy"
Avatar billede burningice Nybegynder
19. februar 2004 - 10:50 #11
dcname er vil navnet på din Domain Controller... de to andre ved jeg ikke
Avatar billede muppet Nybegynder
19. februar 2004 - 11:04 #12
Det jeg gør er at lave en serverless binding, som beskrevet i de to flg. link

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ad/ad/serverless_binding_and_rootdse.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ad/ad/example_code_for_getting_the_distinguished_name_of_the_domain.asp

Altså *burde* det ikke være nødvendigt at angive 'dcname', så spørgsmålet er nok:

Hvad skal jeg gøre (anderledes) for at anvende serverless binding i en WebService ?
Avatar billede burningice Nybegynder
19. februar 2004 - 11:14 #13
som jeg kan læse ud fra den post jeg linkede til, så ligger problemet i, at når man bruger serverless bruges domænet der er angivet i den pågældende Security Context, og det er åbenbart det der giver problemer.
Avatar billede muppet Nybegynder
19. februar 2004 - 14:49 #14
Well... Nu har jeg efterhånden prøvet en hel del mht. Security

Jeg prøver at impersonate en profil jeg ved har de rettigheder jeg ønsker.
I denne proces benytter jeg mig af flg.:

[DllImport( "advapi32.dll", SetLastError=true, CharSet=CharSet.Auto )]
public 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 )]
public extern static int DuplicateToken(IntPtr hToken, int impersonationLevel, ref IntPtr hNewToken);
   
[DllImport( "Kernel32.dll" )]
public extern static int GetLastError();

private bool ImpersonateValidUser( string _strUserName, string _strDomain, string _strPassword ) {
      WindowsIdentity tempWindowsIdentity;
      IntPtr token = IntPtr.Zero;
      IntPtr tokenDuplicate = IntPtr.Zero;
      objMangement.Scope.Options.Username = this.m_strUserNameForService;
      objMangement.Scope.Options.Password = this.m_strPasswordForService;
      objMangement.Scope.Options.Impersonation = System.Management.ImpersonationLevel.Impersonate;
      objMangement.Scope.Options.EnablePrivileges = true;
      int iLogonStatus = LogonUser( _strUserName, _strDomain, _strPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token );
      if( iLogonStatus != 0 ) {
        if( DuplicateToken( token, 2, ref tokenDuplicate ) != 0 ) {
          tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
          impersonationContext = tempWindowsIdentity.Impersonate();
          if( impersonationContext != null ) {
            return true;
          } else {
            throw new Exception( "impersonateContext empty..." );
          }
        } else {
          throw new Exception( "DuplicateToken failed..." );
        }
      } else {
        throw new Exception( "Logon as impersonater: " + _strUserName + "/" + this.objMangement.Scope.Options.Username + " failed...\nStatus: " + GetLastError().ToString() );
      }
    }

Men jeg får flg. fejlbesked fra Windows:
Code: 1314
Description: A required privilege is not held by the client.
Name: ERROR_PRIVILEGE_NOT_HELD

Jeg tjekker inden jeg kalder LogonUser(...), at det er den rette konto jeg prøver med...

Nogen forslag ?
Avatar billede muppet Nybegynder
23. februar 2004 - 10:45 #15
Denne her lader til at virke istedet for:


[DllImport("ADVAPI32.DLL")]
public static extern int ImpersonateLoggedOnUser(IntPtr phToken);


public bool ImpersonateValidUser( string _strName, string _strDomain, string _strPassword ) {
      IntPtr tok = IntPtr.Zero;
      int LOGON32_LOGON_INTERACTIVE = 2;
      int LOGON32_PROVIDER_DEFAULT = 0;
      bool result = LogonUser( _strName, _strDomain, _strPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref tok );
      if (result) {
        int result1 = ImpersonateLoggedOnUser(tok);
        return result1 != 0 ? true: false;
      }else{
        return false;
      }
    }
Avatar billede burningice Nybegynder
23. februar 2004 - 11:36 #16
interressant... så istedet for at angive en exact sti til din AD, så foretager du en impersonate for at kunne bruge LDAP://rootDSE... er det ikke lidt af en hovsaløsning?
Avatar billede muppet Nybegynder
23. februar 2004 - 14:00 #17
Det funker ikke helt alligevel.
Se: C# DirectorySearcher

Grunden til det er, at det skulle være så generisk som muligt, da WebServicen gerne skulle kunne genanvendes på andre servere/intranet.

Det er første gang jeg arbejder med AD, så det kan meget vel være jeg kager rundt i det ;o)
Avatar billede muppet Nybegynder
23. februar 2004 - 16:21 #18
well...

Fik et tip i en anden tråd om at CDO delen (som jeg startede med) skal eksekveres på Exchange serveren for at virke.
Hopla så skiftede jeg over til at køre WebServicen på samme server som Exchange og får nu flg. "dejlige" fejlmeddelelse:

Unknown error at CDO.Addressee.GetFreeBusy(...) ...

Jeg ved at:
det IKKE er fordi den User jeg bruger ikke eksisterer, den kan den godt finde.
det IKKE er forkert formatering af dato/tid

det kan være en af flg. ting:
String HTTPHost
String VRoot
String UserName
String Password

Men er der nogen der kan fortælle mig, hvilke rettigheder skal 'UserName' have, hvis nogen overhovedet !?

Hvad er HTTPHost og VRoot ?
Dem har jeg som blanke/tomme pt.
Avatar billede muppet Nybegynder
23. februar 2004 - 16:43 #19
Errorcode: -1073283067
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester