ID Artikel: 196070 - Kajian Terakhir: 20 September 2011 - Revisi: 2.0

Bagaimana pemrograman menyebabkan penciptaan profil pengguna

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.

Pada Halaman ini

Perbesar semua | Perkecil semua

RINGKASAN

Artikel ini menunjukkan bagaimana pemrograman menyebabkan profil pengguna untuk dibuat tanpa memerlukan logon interaktif.

INFORMASI LEBIH LANJUT

Secara default, profil pengguna baru tidak diciptakan sampai pengguna log on ke komputer interaktif. Logon interaktif terjadi ketika pengguna log on ke komputer dengan menekan CTRL + ALT + DEL untuk mendapatkan akses melalui kotak dialog WinLogon.

Dimungkinkan untuk pemrograman menyebabkan profil pengguna akan dibuat tanpa memerlukan logon interaktif dengan menelepon LoadUserProfile() API. Dalam Windows 2000 dan Windows XP, fungsi ini terkena dalam file header Platform SDK dan didokumentasikan di perpustakaan MSDN. Pada Windows NT 4.0, LoadUserProfile() API tidak terkena, tetapi masih dapat disebut oleh secara dinamis loading perpustakaan Userenv.dll dan mendapatkan pointer ke fungsi.

Memanggil LoadUserProfile() pada Windows NT 4.0

Sisa artikel ini menunjukkan bagaimana bekerja dengan profil pengguna struktur dan fungsi pada Windows NT 4.0. Untuk informasi lengkap tentang struktur dan fungsi ini, lihat dokumentasi Platform SDK rilis terbaru dari perpustakaan MSDN.

Struktur PROFILEINFO

The PROFILEINFO struktur ini menyediakan informasi tentang profil pengguna:
   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 menentukan ukuran struktur, dalam bytes.

dwFlags dapat menjadi salah satu bendera berikut:
PI_NOUI (1)--mencegah menampilkan pesan kesalahan profil.
PI_APPLYPOLICY (2)--berlaku Windows NT 4.0-gaya kebijakan.
lpUserName adalah sebuah pointer ke nama pengguna.

lpProfilePath adalah sebuah pointer ke lintasan profil roaming.

lpDefaultPath adalah sebuah pointer ke lintasan profil pengguna default.

lpServerName adalah sebuah pointer ke nama kontroler domain memvalidasi, dalam NetBIOS format.

lpPolicyPath adalah sebuah pointer ke lintasan berkas kebijakan.

hProfile akan berisi HKEY_CURRENT_USER registri kunci menangani setelah berhasil kembali.

LoadUserProfile() fungsi

The LoadUserProfile() fungsi beban profil pengguna tertentu. Jika profil yang belum ada, sistem operasi akan membuat. Penelepon harus memiliki hak administratif di komputer.
   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.
				
Jika fungsi berhasil, nilai kembali bernilai tidak nol. Jika fungsi gagal, nilai kembali adalah nol. Untuk kesalahan diperpanjang informasi, GetLastError().

Setelah berhasil kembali, anggota hProfile PROFILEINFO menangani kunci registri terbuka akar pengguna sarang. Tidak menutup menangani hProfile. Sebaliknya, lulus untuk UnloadUserProfile() fungsi.

UnloadUserProfile() fungsi

The UnloadUserProfile fungsi membongkar profil pengguna yang dimuat oleh LoadUserProfile fungsi. Penelepon harus memiliki hak administratif di komputer.
   BOOL UnloadUserProfile(
     HANDLE hToken,
     HANDLE hProfile
   );
				
hToken adalah tanda untuk pengguna. Token harus mengakses TOKEN_IMPERSONATE.

hProfile adalah anggota hProfile PROFILEINFO struktur setelah panggilan sukses untuk LoadUserProfile().
Jika fungsi berhasil, nilai kembali bernilai tidak nol. Jika fungsi gagal, nilai kembali adalah nol. Untuk kesalahan diperpanjang informasi, GetLastError().

GetUserProfileDirectory() fungsi

The GetUserProfileDirectory fungsi mengembalikan path ke direktori root dari profil pengguna tertentu.
   BOOL GetUserProfileDirectory(
     HANDLE  hToken,
     LPTSTR lpProfileDir,
     LPDWORD lpcchSize
   );
hToken adalah tanda untuk pengguna. Token harus mengakses TOKEN_IMPERSONATE.

lpProfilesDir adalah sebuah pointer ke buffer yang menerima path ke direktori profil pengguna tertentu.

lpcchSize menentukan ukuran penyangga lpProfilesDir, dalam bytes.
Jika fungsi berhasil, nilai kembali bernilai tidak nol. Jika fungsi gagal, nilai kembali adalah nol. Untuk kesalahan diperpanjang informasi, GetLastError().

Contoh kode

Contoh kode di bawah ini dapat disusun sebagai aplikasi konsol untuk Windows NT 4.0. Pendekatan yang sama ini akan bekerja pada Windows 2000 dan Windows XP, tetapi umumnya akan lebih mudah untuk menyertakan userenv.h header file dan link langsung dengan perpustakaan userenv.lib. Implisit menghubungkan lebih disukai karena tidak memerlukan secara dinamis loading DLL dan mengambil fungsi petunjuk untuk api profil pengguna.

Kode ini menunjukkan cara pemrograman membuat pengguna baru rekening, memaksa profil yang akan dibuat untuk pengguna baru, dan mengambil direktori profil baru:
   //**********************************************************************
   // 
   //  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;
   }
				

Berlaku bagi:
  • Microsoft Win32 Application Programming Interface
Kata kunci: 
kbcode kbhowto kbkernbase kbmt KB196070 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:196070  (http://support.microsoft.com/kb/196070/en-us/ )