Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Możesz użyć metod uwierzytelniania interfejsu dostawcy obsługi zabezpieczeń (SSPI) i inteligentnego transferu w tle (BITS), aby uzyskać poświadczenia od użytkownika, zakodować poświadczenia i ustawić zakodowane poświadczenia w zadaniu transferu usługi BITS. Kodowanie jest wymagane do przekonwertowania struktury poświadczeń na ciągi, które można przekazać do zadania transferu usługi BITS.
Aby uzyskać więcej informacji na temat uwierzytelniania i metod SSPI, zobacz SSPI.
Poniższa procedura wyświetla monit o poświadczenia od użytkownika przy użyciu pakietu zabezpieczeń Negotiate. Program tworzy strukturę tożsamości uwierzytelniania i wypełnia strukturę ciągami zakodowanymi, które reprezentują nazwę użytkownika, domenę i hasło użytkownika. Następnie program tworzy zadanie pobierania usługi BITS i ustawia zakodowaną nazwę użytkownika i hasło jako poświadczenia zadania. Program zwalnia strukturę tożsamości uwierzytelniania po tym, jak nie jest już potrzebny.
W tym przykładzie użyto nagłówka i implementacji zdefiniowanej w Przykład: Typowe klasy.
Aby używać kodowania uwierzytelniania SSPI z zadaniami transferu usługi BITS
- Zainicjuj parametry MODELU COM, wywołując funkcję CCoInitializer. Aby uzyskać więcej informacji na temat funkcji CCoInitializer, zobacz Example: Common Classes.
- Pobierz wskaźniki dla interfejsów IBackgroundCopyManager, IBackgroundCopyJob, interfejsów IBackgroundCopyJob 2. W tym przykładzie użyto klasy CComPtr do zarządzania wskaźnikami interfejsu COM.
- Utwórz strukturę CREDUI_INFO zawierającą informacje dotyczące dostosowywania wyglądu okna dialogowego dla funkcji SspiPromptForCredentials. Następnie monituj o poświadczenia od użytkownika. Aby uzyskać więcej informacji, zobacz funkcję SspiPromptForCredentials.
- Zakoduj strukturę poświadczeń jako ciągi, które można przekazać do zadania transferu usługi BITS przy użyciu funkcji SspiEncodeAuthIdentityAsStrings.
- Przygotowanie struktury BG_AUTH_CREDENTIALS.
- Inicjowanie zabezpieczeń procesu COM przez wywołanie CoInitializeSecurity. Usługa BITS wymaga co najmniej poziomu personifikacji personifikacji. Usługa BITS kończy się niepowodzeniem z E_ACCESSDENIED, jeśli nie ustawiono poprawnego poziomu personifikacji.
- Uzyskaj początkowy lokalizator do usługi BITS, wywołując funkcję CoCreateInstance.
- Utwórz zadanie transferu usługi BITS, wywołując metodę IBackgroundCopyManager::CreateJob.
- Pobierz identyfikator interfejsu IBackgroundCopyJob2 i wywołaj metodę IBackgroundCopyJob::QueryInterface.
- Wypełnij strukturę BG_AUTH_CREDENTIALS zakodowaną nazwą użytkownika i ciągami haseł, a następnie ustaw schemat uwierzytelniania na Wartość Negotiate (BG_AUTH_SCHEME_NEGOTIATE).
- Użyj wskaźnika IBackgroundCopyJob2, aby wysyłać żądania do usługi BITS. Ten program używa metody IBackgroundCopyJob2::SetCredentials, aby ustawić poświadczenia dla zadania transferu usługi BITS.
- Dodaj pliki, zmodyfikuj właściwości lub wznów zadanie transferu usługi BITS.
- Po zakończeniu zadania transferu usługi BITS usuń zadanie z kolejki, wywołując IBackgroundCopyJob::Complete.
- Na koniec zwolnij strukturę tożsamości uwierzytelniania, wywołując funkcję SspiFreeAuthIdentity.
W poniższym przykładzie kodu pokazano, jak używać kodowania uwierzytelniania SSPI z zadaniami transferu usługi BITS.
#define SECURITY_WIN32
#define _SEC_WINNT_AUTH_TYPES
#include <windows.h>
#include <ntsecapi.h>
#include <bits.h>
#include <sspi.h>
#include <wincred.h>
#include <iostream>
#include <atlbase.h>
#include "CommonCode.h"
void PromptForCredentials(PWSTR pwTargetName)
{
HRESULT hr;
// If CoInitializeEx fails, the exception is unhandled and the program terminates
CCoInitializer coInitializer(COINIT_APARTMENTTHREADED);
CComPtr<IBackgroundCopyManager> pQueueMgr;
CComPtr<IBackgroundCopyJob> pJob;
CComPtr<IBackgroundCopyJob2> pJob2;
PSEC_WINNT_AUTH_IDENTITY_OPAQUE pAuthIdentityEx2 = NULL;
DWORD dwFlags = 0;
BOOL fSave = FALSE;
BOOL bReturn = TRUE;
CREDUI_INFO creduiInfo = { 0 };
creduiInfo.cbSize = sizeof(creduiInfo);
// Change the message text and caption to the actual text for your dialog.
creduiInfo.pszMessageText = pwTargetName;
creduiInfo.pszCaptionText = L"SSPIPFC title for the dialog box";
try {
// Prompt for credentials from user using Negotiate security package.
DWORD dwRet = SspiPromptForCredentials(
pwTargetName,
&creduiInfo,
0,
L"Negotiate",
NULL,
&pAuthIdentityEx2,
&fSave,
dwFlags
);
if (SEC_E_OK != dwRet)
{
// Prompt for credentials failed.
throw MyException(dwRet, L"SspiPromptForCredentials");
}
if (NULL != pAuthIdentityEx2)
{
GUID guidJob;
BG_AUTH_CREDENTIALS authCreds;
PCWSTR pwUserName = NULL;
PCWSTR pwDomainName = NULL;
PCWSTR pwPassword = NULL;
// Encode credential structure as strings that can
// be passed to a BITS job.
SECURITY_STATUS secStatus = SspiEncodeAuthIdentityAsStrings(
pAuthIdentityEx2,
&pwUserName,
&pwDomainName,
&pwPassword
);
if(SEC_E_OK != secStatus)
{
// Encode authentication identity as strings.
throw MyException(secStatus, L"SspiEncodeAuthIdentityAsStrings");
}
// Show the encoded user name and domain name.
wprintf(
L"User Name: %s\nDomain Name: %s",
pwUserName,
pwDomainName
);
//The impersonation level must be at least RPC_C_IMP_LEVEL_IMPERSONATE.
HRESULT hr = CoInitializeSecurity(
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_CONNECT,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_DYNAMIC_CLOAKING,
0
);
if (FAILED(hr))
{
throw MyException(hr, L"CoInitializeSecurity");
}
// Connect to BITS.
hr = CoCreateInstance(__uuidof(BackgroundCopyManager), NULL,
CLSCTX_LOCAL_SERVER,
__uuidof(IBackgroundCopyManager),
(void**) &pQueueMgr);
if (FAILED(hr))
{
// Failed to connect.
throw MyException(hr, L"CoCreateInstance");
}
// Create a job.
hr = pQueueMgr->CreateJob(
L"EncodeSample",
BG_JOB_TYPE_DOWNLOAD,
&guidJob,
&pJob
);
if(FAILED(hr))
{
// Failed to create a BITS job.
throw MyException(hr, L"CreateJob");
}
// Get IBackgroundCopyJob2 interface.
hr = pJob->QueryInterface(__uuidof(IBackgroundCopyJob2), (void**)&pJob2);
if (FAILED(hr))
{
// Failed to get a reference to the IBackgroundCopyJob2 interface.
throw MyException(hr, L"QueryInterface(IBackgroundCopyJob2)");
}
// Create a BITS authentication structure from the encoded strings.
authCreds.Target = BG_AUTH_TARGET_SERVER;
authCreds.Scheme = BG_AUTH_SCHEME_NEGOTIATE;
authCreds.Credentials.Basic.UserName = (LPWSTR)pwUserName;
authCreds.Credentials.Basic.Password = (LPWSTR)pwPassword;
// Set the credentials for the job.
hr = pJob2->SetCredentials(&authCreds);
if (FAILED(hr))
{
// Failed to set credentials.
throw MyException(hr, L"SetCredentials");
}
// Modify the job's property values.
// Add files to the job.
// Activate (resume) the job in the transfer queue.
// Remove the job from the transfer queue.
hr = pJob->Complete();
if (FAILED(hr))
{
// Failed to complete the job.
throw MyException(hr, L"Complete");
}
}
}
catch(std::bad_alloc &)
{
wprintf(L"Memory allocation failed");
if (pJob != NULL)
{
pJob->Cancel();
}
}
catch(MyException &ex)
{
wprintf(L"Error %x occurred during operation", ex.Error);
if (pJob != NULL)
{
pJob->Cancel();
}
}
// Free the auth identity structure.
if (NULL != pAuthIdentityEx2)
{
SspiFreeAuthIdentity(pAuthIdentityEx2);
pAuthIdentityEx2 = NULL;
}
return;
}
void _cdecl _tmain(int argc, LPWSTR* argv)
{
PromptForCredentials(L"Target");
}
Tematy pokrewne