Makale numarası: 196070 - Son Gözden Geçirme: 21 Kasım 2006 Salı - Gözden geçirme: 4.2

Program aracılığıyla bir kullanıcı profili oluşturmayı neden nasıl kullanılır

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Bu makalede, program aracılığıyla bir kullanıcı profilinin bir etkileşimli oturum açma gerekmeksizin oluşturulmasına neden gösterilmiştir.

Daha fazla bilgi

Varsayılan olarak, yeni bir kullanıcı profili bilgisayarda kullanıcı günlüklerini kadar etkileşimli olarak oluşturulmadı. WinLogon iletişim kutusu üzerinden erişmek için CTRL + ALT + DEL tuşlarına basarak bilgisayara bir kullanıcı oturum açtığında bir etkileşimli oturum açma oluşur.

Program aracılığıyla bir kullanıcı profilinin bir etkileşimli oturum açma LoadUserProfile() APı'SINI çağırarak gerekmeksizin oluşturulacak neden olabilir. Windows 2000 ve Windows XP'de, bu işlev Platform SDK üstbilgi dosyaları kullandığı ve MSDN Kitaplığı'de belgelenen. Windows NT 4. 0'da, LoadUserProfile() API değil açıktır, ancak dinamik olarak Userenv.dll kitaplığı yüklemesinde ve işlevini gösteren bir işaretçi alma hala çağrılabilir.

Windows NT 4.0 üzerinde LoadUserProfile() çağrılıyor.

Bu makalenin geri kalanında kullanıcı profili yapıları ve işlevleri ile Windows NT 4. 0'da nasıl gösterir. Bu yapıları ve işlevleri hakkında tam bilgi için Platform SDK belgelerine MSDN Kitaplığı'nın en son sürümdeki bakın.

PROFILEINFO yapısı

Bir kullanıcı profili bilgilerini PROFILEINFO yapısını sağlar:
   typedef struct _PROFILEINFO {
       DWORD   dwSize;          // size of structure
       DWORD   dwFlags;         // flags
       LPTSTR  lpUserName;      // user name
       LPTSTR  lpProfilePath;   // roaming profile path
       LPTSTR  lpDefaultPath;   // default user profile path
       LPTSTR  lpServerName;    // validating domain controller name
       LPTSTR  lpPolicyPath;    // Windows NT 4.0-style policy file
       HANDLE  hProfile;        // registry key handle
   } PROFILEINFO, FAR * LPPROFILEINFO;
				
dwSize yapısının boyutunu bayt olarak belirtir.

Aşağıdaki bayraklardan birini dwFlags olabilir:
PI_NOUI (1), profil hata iletilerinin görüntülenmesini önler.
<a1>PI_APPLYPOLICY</a1> (2), Windows NT 4.0 stilinde ilke uygulanır.
lpUserName kullanıcı adına bir işaretçidir.

lpProfilePath gezici profil yolu bir işaretçidir.

lpDefaultPath varsayılan kullanıcı profil yolu bir işaretçidir.

lpServerName doğrulama etki alanı denetleyicisinin Netbıos biçim adına bir işaretçidir.

lpPolicyPath ilke dosyasının yolunu bir işaretçidir.

başarılı iade sonrasında HKEY_CURRENT_USER kayıt defteri anahtar tanıtıcısı hProfile içerir.

LoadUserProfile() işlevi

LoadUserProfile() işlevi, belirtilen bir kullanıcının profilini yükler. Işletim sistemi profili henüz yoksa oluşturur. Arayanın, bilgisayarda yönetici ayrıcalıkları olmalıdır.
   BOOL LoadUserProfile(
     HANDLE hToken,
     LPPROFILEINFO lpProfileInfo
   );

   hToken is a token for the user. The token must have TOKEN_IMPERSONATE
   access.

   lpProfileInfo is a pointer to a PROFILEINFO structure.
				
Dönüş değeri, işlevin başarılı olursa, sıfır olmayan değeridir. Işlev başarısız olursa, sonuç değeri sıfırdır. Genişletilmiş hata bilgilerini almak için <a0></a0>, GetLastError() arayın.

Başarılı iade PROFILEINFO hProfile üyesi bir kullanıcı kovanı köke açılan bir kayıt defteri anahtar tanıtıcısı ' dir. HProfile tanıtıcı kapatmayın. Bunun yerine UnloadUserProfile() işlevine geçirir.

UnloadUserProfile() işlevi

UnloadUserProfile işlevi LoadUserProfile işlevi tarafından yüklenen bir kullanıcının profilini kaldırır. Arayanın, bilgisayarda yönetici ayrıcalıkları olmalıdır.
   BOOL UnloadUserProfile(
     HANDLE hToken,
     HANDLE hProfile
   );
				
hToken kullanıcı simgesidir. Belirteç TOKEN_IMPERSONATE erişiminiz olmalıdır.

hProfile PROFILEINFO yapısını hProfile üyesi sonra LoadUserProfile() Çağrı başarılı olur.
Dönüş değeri, işlevin başarılı olursa, sıfır olmayan değeridir. Işlev başarısız olursa, sonuç değeri sıfırdır. Genişletilmiş hata bilgilerini almak için <a0></a0>, GetLastError() arayın.

GetUserProfileDirectory() işlevi

GetUserProfileDirectory işlevi, belirtilen kullanıcı profilinin kök dizininin yolunu döndürür.
   BOOL GetUserProfileDirectory(
     HANDLE  hToken,
     LPTSTR lpProfileDir,
     LPDWORD lpcchSize
   );
hToken kullanıcı simgesidir. Belirteç TOKEN_IMPERSONATE erişiminiz olmalıdır.

lpProfilesDir belirtilen kullanıcının profil dizini yolunu alır arabelleğin bir işaretçidir.

lpcchSize lpProfilesDir arabelleğinin boyutu bayt olarak belirtir.
Dönüş değeri, işlevin başarılı olursa, sıfır olmayan değeridir. Işlev başarısız olursa, sonuç değeri sıfırdır. Genişletilmiş hata bilgilerini almak için <a0></a0>, GetLastError() arayın.

Örnek kod

Aşağıdaki örnek kod bir konsol uygulaması olarak, Windows NT 4.0 için derlenebilir. Aynı bu yaklaşım, Windows 2000 ve Windows XP'de çalışır, ancak bu genellikle userenv.h üstbilgi dosyası ve doğrudan userenv.lib kitaplığı ile bağlantı eklemek daha kolay olacaktır. Dinamik olarak DLL yükleniyor ve kullanıcı profili Apı'lar için işlev işaretçileri alma gerektirmediğinden örtülü bağlama tercih edilir.

Bu kod, programlı olarak yeni bir kullanıcı hesabı oluşturmak için yeni bir kullanıcı oluşturulması için bir profil zorlamak ve yeni profil dizini almak gösterilmiştir:
   //**********************************************************************
   // 
   //  This program creates a new user account, forces a profile to be
   //  created for the new user, and retrieves the new profile directory
   // 
   //  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
   //  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
   //  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
   //  PARTICULAR PURPOSE.
   // 
   //  Copyright (C) 1998 Microsoft Corporation. All rights reserved.
   //  Author: Jonathan Russ (jruss)
   // 
   //**********************************************************************

   // NOTE: This code must be linked with netapi32.lib

   #include <windows.h>
   #include <tchar.h>
   #include <stdio.h>
   #include <lm.h>

   // Declarations based on USERENV.H for Windows 2000 Beta 2
   #define PI_NOUI         0x00000001   // Prevents displaying of messages
   #define PI_APPLYPOLICY  0x00000002   // Apply NT4 style policy

   typedef struct _PROFILEINFO {
      DWORD    dwSize;          // Must be set to sizeof(PROFILEINFO)
      DWORD    dwFlags;         // See flags above
      LPTSTR   lpUserName;      // User name (required)
      LPTSTR   lpProfilePath;   // Roaming profile path
      LPTSTR   lpDefaultPath;   // Default user profile path
      LPTSTR   lpServerName;    // Validating DC name in netbios format
      LPTSTR   lpPolicyPath;    // Path to the NT4 style policy file
      HANDLE   hProfile;        // Registry key handle - filled by function
   } PROFILEINFO, FAR * LPPROFILEINFO;

   // Typedefs for function pointers in USERENV.DLL
   typedef BOOL (STDMETHODCALLTYPE FAR * LPFNLOADUSERPROFILE) (
      HANDLE hToken,
      LPPROFILEINFO lpProfileInfo
   );

   typedef BOOL (STDMETHODCALLTYPE FAR * LPFNUNLOADUSERPROFILE) (
      HANDLE hToken,
      HANDLE hProfile
   );

   typedef BOOL (STDMETHODCALLTYPE FAR * LPFNGETUSERPROFILEDIR) (
      HANDLE hToken,
      LPTSTR lpProfileDir,
      LPDWORD lpcchSize
   );

   HMODULE                 g_hUserEnvLib           = NULL;
   LPFNLOADUSERPROFILE     LoadUserProfile         = NULL;
   LPFNUNLOADUSERPROFILE   UnloadUserProfile       = NULL;
   LPFNGETUSERPROFILEDIR   GetUserProfileDirectory = NULL;


   //**********************************************************************
   // 
   //  FUNCTION:     InitUserEnv - This function dynamically links to
   //                USERENV.DLL and sets up the required function pointers
   // 
   //  PARAMETERS:   none
   // 
   //  RETURN VALUE: TRUE if successful. Otherwise, FALSE.
   // 
   //**********************************************************************

   BOOL InitUserEnv( void ) {

      g_hUserEnvLib = LoadLibrary( _T("userenv.dll") );
      if ( !g_hUserEnvLib ) {
         _tprintf( _T("LoadLibrary(userenv.dll) failed.  Error %d\n"),
              GetLastError() );
         return FALSE;
      }

   #ifdef UNICODE
      LoadUserProfile =
            (LPFNLOADUSERPROFILE) GetProcAddress( g_hUserEnvLib,
            "LoadUserProfileW" );
   #else
      LoadUserProfile =
            (LPFNLOADUSERPROFILE) GetProcAddress( g_hUserEnvLib,
            "LoadUserProfileA" );
   #endif

      if (!LoadUserProfile) {
         _tprintf( _T("GetProcAddress(%s) failed.  Error %d\n"),
               "LoadUserProfile", GetLastError() );
         return FALSE;
      }

      UnloadUserProfile =
            (LPFNUNLOADUSERPROFILE) GetProcAddress( g_hUserEnvLib,
            "UnloadUserProfile" );

      if (!UnloadUserProfile) {
         _tprintf( _T("GetProcAddress(%s) failed.  Error %d\n"),
               "UnloadUserProfile", GetLastError() );
         return FALSE;
      }

   #ifdef UNICODE
      GetUserProfileDirectory =
            (LPFNGETUSERPROFILEDIR) GetProcAddress( g_hUserEnvLib,
            "GetUserProfileDirectoryW" );
   #else
      GetUserProfileDirectory =
            (LPFNGETUSERPROFILEDIR) GetProcAddress( g_hUserEnvLib,
            "GetUserProfileDirectoryA" );
   #endif

      if (!GetUserProfileDirectory) {
         _tprintf( _T("GetProcAddress(%s) failed.  Error %d\n"),
               "GetUserProfileDirectory", GetLastError() );
         return FALSE;
      }

      return TRUE;
   }


   //**********************************************************************
   // 
   //  FUNCTION:     _tmain - This is the entry point for the program.
   // 
   //  PARAMETERS:   argc - the number of command-line arguments
   //                argv - an array of null-terminated strings specifying
   //                       the command-line arguments
   //                envp - an array of null-terminated strings specifying
   //                       the environment strings
   // 
   //  RETURN VALUE: Zero if successful. Otherwise, non-zero.
   // 
   //**********************************************************************

   #ifdef __cplusplus
      extern "C"
   #endif

   #ifdef UNICODE
      int _cdecl
   #else
      int
   #endif

   _tmain(int argc, _TCHAR **argv, _TCHAR **envp) {

      USER_INFO_1   ui1;
      DWORD         dwError;
      HANDLE        hToken;
      PROFILEINFO   pi;
      TCHAR         szProfilePath[1024];
      DWORD         cchPath = 1024;
      WCHAR         szUserName[20];
      WCHAR         szPassword[20];

      // Check for the required command-line arguments
      if (argc < 2) {
         _tprintf( _T("Usage: AddUser <user> [password]\n") );
         return -1;
      }

      // Set USERENV.DLL function pointers
      if ( !InitUserEnv() ) {
         _tprintf( _T("Failed to set USERENV.DLL function pointers.\n") );
         return -1;
      }

      // Create local copies of the user name and password
      #ifdef UNICODE

      _tcscpy( szUserName, argv[1] );
      if ( argc == 2 ) {
         _tcscpy( szPassword, szUserName );
      } else {
         _tcscpy( szPassword, argv[2] );
      }

      #else
      {
         int n;

         n = MultiByteToWideChar(0, 0, argv[1], -1, szUserName, 20);
         if (n == 0)
         {
            _tprintf( _T("Failed to convert username to unicode\n"));
            return -1;
         }

         if ( argc == 2 ) {
            n = MultiByteToWideChar(0, 0, argv[1], -1, szPassword, 20);
         } else {
            n = MultiByteToWideChar(0, 0, argv[2], -1, szPassword, 20);
         }
         if (n == 0)
         {
            _tprintf( _T("Failed to convert password to unicode\n"));
            return -1;
         }
      }
      #endif

      // Set up the USER_INFO_1 structure that will be used to create the
      // new user account
      ZeroMemory( &ui1, sizeof(ui1) );
      ui1.usri1_name = szUserName;
      ui1.usri1_password = szPassword;
      ui1.usri1_priv = USER_PRIV_USER;
      ui1.usri1_flags = UF_NORMAL_ACCOUNT | UF_SCRIPT;

      // Create the new user account
      dwError = NetUserAdd(
            NULL,            // target computer name
            1,               // info level
            (LPBYTE) &ui1,   // address of user info structure
            NULL );          // index to invalid parameter
      if ( dwError != NERR_Success ) {
         _tprintf( _T("NetUserAdd() failed.  Error %d\n"), dwError );
         dwError = ERROR_ACCESS_DENIED;
         return -1;
      }

      // Do a network logon because most systems do not grant new users
      // the right to logon interactively (SE_INTERACTIVE_LOGON_NAME)
      // but they do grant the right to do a network logon
      // (SE_NETWORK_LOGON_NAME). A network logon has the added advantage
      // of being quicker.

      // NOTE: To call LogonUser(), the current user must have the
      // SE_TCB_NAME privilege
      if ( !LogonUser(
            argv[1],                        // user name
            _T("."),                        // domain or server
            (argc == 2) ? argv[1]:argv[2],  // password
            LOGON32_LOGON_NETWORK,          // type of logon operation
            LOGON32_PROVIDER_DEFAULT,       // logon provider
            &hToken ) ) {                   // pointer to token handle
         _tprintf( _T("LogonUser() failed.  Error %d\n"), GetLastError() );
         return -1;
      }

      // Set up the PROFILEINFO structure that will be used to load the
      // new user's profile
      ZeroMemory( &pi, sizeof(pi) );
      pi.dwSize = sizeof(pi);

      #ifdef UNICODE
      pi.lpUserName = szUserName;
      #else
      pi.lpUserName = argv[1];
      #endif

      pi.dwFlags = PI_NOUI;

      // Load the profile. Since it doesn't exist, it will be created
      if ( !LoadUserProfile(
            hToken,        // token for the user
            &pi ) ) {      // pointer to PROFILEINFO structure
         _tprintf( _T("LoadUserProfile() failed.  Error %d\n"),
               GetLastError() );
         return -1;
      }

      // Unload the profile when it is no longer needed
      if ( !UnloadUserProfile(
            hToken,              // token for the user
            pi.hProfile ) ) {    // registry key handle
         _tprintf( _T("UnloadUserProfile() failed.  Error %d\n"),
               GetLastError() );
         return -1;
      }

      // Retrieve the new user's profile directory
      if ( !GetUserProfileDirectory( hToken, szProfilePath, &cchPath ) ) {
         _tprintf( _T("GetProfilePath() failed.  Error %d\n"),
               GetLastError() );
         return -1;
      }

      // Display the new user's profile directory
      _tprintf( _T("The new user's profile path is %s\n"), szProfilePath );

      // Release USERENV.DLL
      if ( g_hUserEnvLib ) {
         FreeLibrary( g_hUserEnvLib );
      }

      return 0;
   }
				

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Win32 Uygulama Programlama Arabirimi, Ne zaman ne ile kullanilir:
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • the operating system: Microsoft Windows XP
Anahtar Kelimeler: 
kbmt kbcode kbhowto kbkernbase KB196070 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:196070  (http://support.microsoft.com/kb/196070/en-us/ )