Login gagal untuk pengguna 'DOMAIN \ MACHINENAME $'

120

Saya tahu ini hampir merupakan duplikat dari: Kesalahan "Login gagal untuk pengguna 'NT AUTHORITY \ IUSR'" di ASP.NET dan SQL Server 2008 dan Login gagal untuk 'nama pengguna' pengguna - System.Data.SqlClient.SqlException dengan LINQ di proyek eksternal / perpustakaan kelas tetapi beberapa hal tidak bertambah dibandingkan dengan aplikasi lain di server saya dan saya tidak yakin mengapa.

Kotak yang digunakan:

Kotak Web Kotak Uji SQL
Kotak
SQL

Lamaran saya:

Saya memiliki Aplikasi Web ASP.NET, yang mereferensikan perpustakaan kelas yang menggunakan LINQ-to-SQL. String koneksi disiapkan dengan benar di perpustakaan kelas. Sesuai Login gagal untuk 'nama pengguna' pengguna - System.Data.SqlClient.SqlException dengan LINQ di perpustakaan proyek / kelas eksternal Saya juga menambahkan string koneksi ini ke Aplikasi Web.

String koneksi menggunakan kredensial SQL seperti itu (di aplikasi web dan pustaka kelas):

 <add name="Namespace.My.MySettings.ConnectionStringProduction"
        connectionString="Data Source=(SQL Test Box);Initial Catalog=(db name);Persist Security Info=True;User ID=ID;Password=Password"
        providerName="System.Data.SqlClient" />

Sambungan ini dikonfirmasi berfungsi dengan menambahkannya ke Server Explorer. Ini adalah string koneksi yang digunakan file .dbml saya.

Masalah:

Saya mendapatkan kesalahan berikut:

System.Data.SqlClient.SqlException: Login failed for user 'DOMAIN\MACHINENAME$'.

Sekarang referensi ini Kesalahan "Login gagal untuk pengguna 'NT AUTHORITY \ IUSR'" di ASP.NET dan SQL Server 2008 dikatakan bahwa itu benar-benar layanan jaringan lokal dan menggunakan nama non-domain lainnya tidak akan berfungsi.

Tapi saya bingung karena saya telah memeriksa SQL Box dan SQL Test Box SQL Management Studio dan keduanya ada di NT AUTHORITY/NETWORK SERVICEbawah Keamanan -> Masuk, di tingkat basis data, yang tidak terdaftar di bawah Keamanan -> Pengguna, tetapi di tingkat basis data Keamanan -> Pengguna Saya memiliki pengguna yang ditampilkan dalam string koneksi.

Pada level NTFS di server web, izin memiliki NETWORK SERVICE yang memiliki kendali penuh.

Alasan mengapa saya bingung adalah karena saya memiliki banyak aplikasi web lain di Server Web saya, database referensi itu ada di SQL Box dan SQL Test Box, dan semuanya berfungsi. Tetapi saya tidak dapat menemukan perbedaan antara mereka dan aplikasi saya saat ini, selain saya menggunakan perpustakaan kelas. Apakah itu penting? Memeriksa izin NTFS, penataan Login Keamanan di tingkat server dan database, string koneksi dan metode penyambungan (kredensial SQL Server), dan kumpulan aplikasi IIS dan opsi folder lainnya, semuanya sama.

Mengapa aplikasi ini bekerja tanpa menambahkan machinename $ ke izin salah satu kotak SQL saya? Tapi itulah yang dikatakan oleh satu tautan kepada saya untuk memperbaiki masalah ini.

SventoryMang
sumber
Jadi untuk rekap, Anda tidak menggunakan pengguna database? Kami membuatnya dan dapat beralih antara itu dan SA tergantung pada apa yang perlu kami lakukan ...
jcolebrand
Dalam string koneksi saya menggunakan pengguna database, yang saya buat di area Keamanan -> Masuk, menambahkannya ke Keamanan -> pengguna database, dan memberinya izin dbo. Begitulah cara saya melakukan semua aplikasi saya yang lain juga.
SventoryMang
Berikut penjelasan jelas dari MSDN menggunakan nama mesin default, pada dasarnya Anda tinggal menambahkan domain / mesin $ ke sql tanpa menekan pencarian. blogs.msdn.microsoft.com/ericparvin/2015/04/14/…
Brett Maiwald

Jawaban:

156

LAYANAN JARINGAN dan LocalSystem akan mengotentikasi diri mereka sendiri selalu sebagai akun koresponden secara lokal (layanan jaringan \ bawaan dan sistem \ bawaan) tetapi keduanya akan mengautentikasi sebagai akun mesin dari jarak jauh.

Jika Anda melihat kegagalan seperti Login failed for user 'DOMAIN\MACHINENAME$'itu berarti bahwa proses berjalan sebagai LAYANAN JARINGAN atau sebagai LocalSystem telah mengakses sumber daya jarak jauh, telah mengautentikasi dirinya sebagai akun mesin dan ditolak otorisasi.

Contoh umumnya adalah aplikasi ASP yang berjalan di kumpulan aplikasi yang disetel untuk menggunakan kredensial LAYANAN JARINGAN dan menyambungkan ke SQL Server jarak jauh: kumpulan aplikasi akan mengautentikasi saat mesin menjalankan kumpulan aplikasi, dan apakah akun mesin ini yang perlu diberi akses .

Jika akses ditolak ke akun mesin, maka akses harus diberikan ke akun mesin. Jika server menolak untuk login 'DOMAIN \ MACHINE $', maka Anda harus memberikan hak login ke 'DOMAIN \ MACHINE $' bukan untuk NETWORK SERVICE. Memberikan akses ke NETWORK SERVICE akan memungkinkan proses lokal yang berjalan sebagai NETWORK SERVICE untuk terhubung, bukan yang jarak jauh, karena yang jauh akan mengautentikasi sebagai, tebak Anda, DOMAIN \ MACHINE $.

Jika Anda mengharapkan aplikasi asp untuk menyambung ke SQL Server jarak jauh sebagai login SQL dan Anda mendapatkan pengecualian tentang DOMAIN \ MACHINE $ itu berarti Anda menggunakan Keamanan Terintegrasi dalam string koneksi. Jika ini tidak terduga, itu berarti Anda mengacaukan string koneksi yang Anda gunakan.

Remus Rusanu
sumber
2
Benar itu yang saya kumpulkan, terima kasih atas penjelasannya. Namun, pertanyaannya tetap ada, semua aplikasi saya dihosting di Server Web saya tetapi mengakses database di kotak SQL atau SQL Test, itu akan menjadi akses jarak jauh ya? Namun mereka berfungsi ... tetapi tidak satu pun dari kotak SQL saya yang memberikan akses DOMAIN \ MACHINENAME $.
SventoryMang
1
Oh juga, saya berharap untuk terhubung ke SQL server sebagai SQL Login tetapi saya telah memposting string koneksi saya, saya tidak menggunakan opsi Integrated Security = True, apa lagi itu ??
SventoryMang
2
Ada tiga kemungkinan penjelasan: 1) mereka menggunakan autentikasi SQL, bukan autentikasi terintegrasi (yang tampaknya paling masuk akal, karena Anda misalnya memiliki userid dan kata sandi dalam string conn) 2) mereka menggunakan autentikasi terintegrasi dan dijalankan dalam polling aplikasi yang menggunakan kredensial yang berbeda atau 3) mereka menggunakan autentikasi terintegrasi tetapi aplikasi ASP meniru pemanggil, sehingga memicu delegasi terbatas: technet.microsoft.com/en-us/library/cc739587%28WS.10%29.aspx .
Remus Rusanu
2
Proyek aplikasi web Anda harus mereferensikan proyek perpustakaan kelas , bukan dll. Tambahkan proyek perpustakaan kelas ke solusi aplikasi web, lalu hapus referensi ke dll dan tambahkan referensi ke proyek. Dengan cara ini, saat menerapkan atau menguji, aplikasi web retail akan mereferensikan dll kelas retail dan debug akan mereferensikan debug, secara otomatis.
Remus Rusanu
1
Meskipun ini semua baik dan bagus, bagaimana Anda menambahkan login mesin ke SQL? - Keduanya berada di domain yang sama, dan saya lebih suka menggunakan keamanan terintegrasi. Tetapi hanya menambahkan akun bernama "Domain \ MachineName $" sama sekali gagal (seperti, tidak ada, dan penjelajah objek tersedak dan gagal menemukan yang seperti itu).
BrainSlugs83
33

Galat ini terjadi ketika Anda telah mengkonfigurasi aplikasi Anda dengan IIS, dan IIS masuk ke SQL Server dan mencoba untuk masuk dengan kredensial yang tidak memiliki izin yang tepat. Kesalahan ini juga dapat terjadi saat replikasi atau pencerminan disiapkan. Saya akan membahas solusi yang selalu berhasil dan sangat sederhana. Buka SQL Server >> Keamanan >> Login dan klik kanan pada NT AUTHORITY \ NETWORK SERVICE dan pilih Properties

Di layar yang baru dibuka dari Properti Login, buka tab "Pemetaan Pengguna". Kemudian, pada tab "Pemetaan Pengguna", pilih database yang diinginkan - terutama database yang menampilkan pesan kesalahan ini. Di layar bawah, periksa peran db_owner. Klik OK.

Zain Ali
sumber
7
Ini adalah solusi bagi saya karena aplikasi web dan database berada di mesin yang sama. Saya masih mendapat kesalahan "Login gagal untuk pengguna 'DOMAIN \ MACHINENAME $" tetapi menambahkan mesin ke login SQL tidak membantu, tetapi menambahkan "NT AUTHORITY \ NETWORK SERVICE" membantu. Meskipun Anda tidak boleh menggunakan peran db_owner kecuali diperlukan, biasanya db_datareader dan db_datawriter sudah cukup.
JimiSweden
18

Dalam kasus saya, saya memiliki Identity="ApplicationPoolIdentity"IIS Application Pool.

Setelah saya menambahkan IIS APPPOOL\ApplicationNamepengguna ke SQL Server, ini berfungsi.

nZeus
sumber
5
Saya yakin ini hanya akan berfungsi jika IIS dan SQL server berada di mesin yang sama.
Rob Davis
1
Ini berhasil untuk saya! Saya memiliki penataan server IIS-SQL lokal.
Vin Shahrdar
1
Terima kasih banyak. Masalah ini dimulai untuk saya setelah memutakhirkan lingkungan dev lokal saya dari SQL Server 2014 ke 2017. Saran Anda adalah solusi terbaik dalam situasi ini.
MFry
Terima kasih, bekerja untuk saya juga. Yang ingin saya soroti adalah bahwa pesan kesalahan masih 'Login gagal untuk pengguna' DOMAIN \ MACHINENAME $ 'meskipun pool aplikasi diatur untuk berjalan di bawah identitas pool dan login gagal meskipun sebenarnya' DOMAIN \ MACHINENAME $ 'sebenarnya diberikan izin untuk terhubung. Sepertinya pesan kesalahan menyesatkan bagi saya.
mivra
16

Pada dasarnya untuk mengatasi ini kita perlu menyiapkan beberapa seperti

  • Aplikasi Web Berjalan di bawah ApplicationPoolIdentity
  • Aplikasi Web menghubungkan ke database melalui ADO.Net menggunakan Otentikasi Windows dalam string koneksi

String koneksi yang digunakan dengan otentikasi Windows menyertakan Trusted_Connection=Yesatribut atau atribut yang setara Integrated Security=SSPIdalam Web.configfile

Koneksi database saya dalam mode Otentikasi Windows. Jadi saya menyelesaikannya hanya dengan mengubah Application Pools Identity dari ApplicationPoolIdentity ke kredensial masuk domain saya DomainName \ MyloginId

Langkah:

  1. Klik pada Application Pools
  2. Pilih Nama aplikasi Anda

  3. Pergi ke Pengaturan Lanjutan

  4. Perluas Model Proses dan klik Identitas . Klik tiga titik di ujung kanan.
  5. Klik tombol Set ... dan Berikan kredensial login domain Anda

Bagi saya itu sudah diselesaikan.

Catatan: Di lingkungan Produksi atau TI, Anda mungkin memiliki akun layanan di bawah domain yang sama untuk identitas kumpulan aplikasi. Jika demikian, gunakan akun layanan alih-alih login Anda.

Raj Baral
sumber
Untuk pertanyaan di atas, ini harus menjadi jawaban yang diterima.
makil
14

Trik yang berhasil bagi saya adalah menghapus Integrated Securitydari string koneksi saya dan menambahkan string koneksi reguler User ID=userName; Password=passwordAnda di App.configperpustakaan Anda mungkin tidak menggunakan keamanan terintegrasi tetapi yang dibuat di Web.configadalah!

winy101
sumber
3
Satu miliar terima kasih untuk Anda. Bantuan yang sangat besar. Terima kasih terima kasih terima kasih. Ini, saya yakin, sangat jelas tetapi untuk orang-orang yang akan datang, ini adalah User Id = sesuatu; Kata sandi = sesuatu;
shubniggurath
2
Saya mendapatkan kesalahan yang sama pada judul postingan. Saya menemukan bahwa 'User Id = yourUserid Password = yourPassword' diabaikan ketika "'trusted connection = true'" ada dalam string koneksi database. Saya menghapus "'trusted connection = true'" dari string saya dan itu memperbaiki masalah saya. Ini tidak terjadi sampai saya memindahkan aplikasi dari debugging di VS 2012 ke iis 8.
T3.0
12

Seorang kolega mengalami kesalahan yang sama dan itu karena kesalahan konfigurasi kecil di IIS.
Application Pool yang salah telah ditetapkan untuk aplikasi web.

Memang kami menggunakan Kumpulan Aplikasi khusus dengan Identitas khusus untuk memenuhi kebutuhan kami.

Di Manajer IIS lokalnya -> Situs -> Situs Web Default -> Nama Aplikasi Web Kami -> Pengaturan Dasar ... Kumpulan Aplikasi adalah "DefaultAppPool", bukan Kumpulan Aplikasi kustom kami.

Menetapkan kumpulan aplikasi yang benar memecahkan masalah.

Julien P.
sumber
11

Saya menambahkan <identity impersonate="true" />ke web.config saya dan berfungsi dengan baik.

simonm
sumber
7
Pahami saja ini akan mengubah konteks di mana aplikasi ASP.NET berjalan secara keseluruhan. Alih-alih berjalan di bawah konteks default 'LAYANAN JARINGAN', sekarang akan berjalan di bawah konteks pengguna menggunakan aplikasi (yaitu Domain \ someUser). Terkadang hal ini tidak masalah, tetapi cukup pahami bahwa perubahan ini bukan hanya perbaikan cepat untuk OP dan memang memiliki implikasi hilir lainnya yang mungkin / mungkin tidak diinginkan.
atconway
6

Bagi saya, masalah telah teratasi ketika saya mengganti akun bawaan bawaan 'ApplicationPoolIdentity' dengan akun jaringan yang diizinkan mengakses database.

Pengaturan dapat dibuat di Server Informasi Internet (IIS 7+)> Kumpulan Aplikasi> Pengaturan Lanjut> Model Proses> Identitas

Remco
sumber
4

Bagi saya, masalah dengan 'DOMAIN \ MACHINENAME $' diperbaiki dengan menyetel DefaultApplicationPoolIdentitas ke NetworkService.

masukkan deskripsi gambar di sini

Arsen Khachaturyan
sumber
3

Kami telah mendapatkan pesan kesalahan serupa saat memproses database Analysis Services. Ternyata nama pengguna, yang digunakan untuk menjalankan contoh Analysis Services, belum ditambahkan ke Login Keamanan SQL Server.

Di SQL Server 2012, layanan SQL Server dan Analisis dikonfigurasi untuk dijalankan sebagai pengguna berbeda secara default. Jika Anda menggunakan default, selalu pastikan bahwa pengguna AS memiliki akses ke sumber data Anda!

Philip Atz
sumber
1
Saya memiliki masalah yang sama. Kesalahan dari SSAS sama, tetapi akunnya bukan Layanan Jaringan. Akun tersebut sebenarnya: NT Service \ MSOLAP $ INSTANCENAME
cdonner
2

Periksa apakah Anda punya

User Instance=true

dalam string koneksi. Coba hapus yang akan menyelesaikan masalah Anda.

Sarath Avanavu
sumber
2

Saya juga mengalami kesalahan ini dengan pengguna terotentikasi SQL Server

Saya mencoba beberapa perbaikan, tetapi tidak berhasil.

Solusi dalam kasus saya adalah mengkonfigurasi "Mode Otentikasi Server" untuk memungkinkan otentikasi SQL Server, di bawah Studio Manajemen: Properti / Keamanan.

Arjan
sumber
1

Satu-satunya hal yang tampaknya diabaikan oleh semua orang adalah bahwa Anda mungkin menginginkan keamanan terintegrasi = true. Anda mungkin memiliki situs yang berjalan di bawah akun kumpulan. Tidak apa-apa jadi dan masih mungkin untuk masuk ke server SQL dengan kredensial pengguna asli dan bukan kumpulan. Ini disebut delegasi terbatas. Jika Anda mengaktifkannya dan menyiapkan jendela SPN akan menerjemahkan kredensial kumpulan dengan permintaan pengguna yang masuk ke layanan akhir (SQL hanyalah salah satu layanan tersebut). Anda harus mendaftarkan SATU DAN HANYA server SQL yang melayani permintaan SQL di server web. Menyiapkan semua ini terlalu berat bagi saya untuk mencoba menjelaskan secara akurat di sini. Saya butuh waktu cukup lama untuk mengatasinya sendiri.

Todd Beaulieu
sumber
0

Saya menghabiskan beberapa jam mencoba untuk memperbaiki masalah dan saya akhirnya mendapatkannya - SQL Server Browser "Berhenti". Cara mengatasinya adalah mengubahnya ke mode "Otomatis":

Jika dinonaktifkan, buka Panel Kontrol-> Alat Administratif-> Layanan, dan cari Agen Server SQL. Klik kanan, dan pilih "Properties." Dari menu tarik-turun "Jenis Startup", ubah dari "Nonaktif" menjadi "Otomatis".

mengutip dari sini

A Petrov
sumber
0

Saya memiliki masalah yang sama sebelumnya, menghapus Persist Security Info=Truedari connectionstring berhasil untuk saya.

msk
sumber
0

Saya mengalami masalah ini ketika klien mengganti nama SQL Server. Layanan Pelaporan SQL dikonfigurasi untuk menyambung ke nama server lama, yang mereka juga telah membuat alias untuk yang dialihkan ke IP nama server baru.

Semua aplikasi IIS lama mereka berfungsi, mengarahkan ke nama server baru melalui alias. Berdasarkan firasat, saya memeriksa apakah mereka menjalankan SSRS. Mencoba menyambung ke situs SSRS Menghasilkan kesalahan:

"Layanan tidak tersedia.Hubungi administrator sistem Anda untuk menyelesaikan masalah. Administrator sistem: Server laporan tidak dapat terhubung ke database-nya. Pastikan database berjalan dan dapat diakses. Anda juga dapat memeriksa log pelacakan server laporan untuk mengetahui detailnya . "

Itu berjalan di server, tetapi gagal terhubung karena menggunakan alias untuk nama server lama. Mengonfigurasi ulang SSRS untuk menggunakan nama server baru, bukan yang lama / alias memperbaikinya.

SQLMonger
sumber
0
  1. Ubah App Pool Identity ke Local System
  2. Di SQL Mgmt> Keamanan> Masuk
    1. Temukan NT AUTHORITY \ SYSTEM dengan klik dua kali
    2. Pemetaan Pengguna> Periksa database Anda dan berikan peran di bawah ini.
    3. Ingat juga untuk membuat basis data pengguna atau login keamanan dengan kata sandi yang benar.
Allan Zeidler
sumber
0

Saya mendapat kesalahan ini mencoba menguji solusi menggunakan yang berikut ini

string cn = "Data Source=[servername];Integrated Security=true;Initial Catalog=[dbname];";

Cara saya menyelesaikannya adalah: Saya harus membuka Visual Studio dan menjalankannya di bawah akun lain, karena akun yang saya gunakan untuk membuka bukan akun Admin saya.

Jadi jika masalah Anda serupa dengan saya: sematkan VS ke bilah tugas, lalu gunakan Shift dan Klik Kanan untuk membuka menu sehingga Anda dapat membuka VS sebagai pengguna lain. masukkan deskripsi gambar di sini

cinta hidup
sumber
0

Saya menghargai ada beberapa jawaban yang bagus di sini, tetapi karena saya baru saja kehilangan waktu untuk mengerjakannya, semoga ini dapat membantu seseorang.

Dalam kasus saya, semuanya telah berfungsi dengan baik, kemudian berhenti tanpa alasan yang jelas dengan kesalahan yang disebutkan dalam pertanyaan.

IIS berjalan sebagai layanan Jaringan dan Layanan Jaringan telah disiapkan di SQL Server sebelumnya (lihat jawaban lain untuk posting ini). Peran server dan pemetaan pengguna tampak benar.

Masalahnya adalah; sama sekali tidak ada alasan yang jelas; Layanan Jaringan telah beralih ke hak Login 'Tolak' dalam database.

Memperbaiki:

  1. Buka SSMS> Keamanan> Masuk.
  2. Klik kanan 'NT AUTHORITY \ NETWORK SERVICE' dan Klik Properties.
  3. Buka tab 'Status' dan setel Permission to Connect To Database Engineke 'Grant'.

Layanan Jaringan Diizinkan

HokiJ
sumber