none
טעינת קבצים משרת מרוחק RRS feed

  • שאלה

  • יש לי שרת SQL 2012.

    ושרת מרוחק שעליו נמצאת תיקיה עם קבצים.

    אני פונה לשרת ה SQL עם משתמש בדומיין שיש לו הרשאת BULK ADMIN על מנת לטעון קובץ

    set @SQL = 'BULK INSERT #ImportEndUser FROM ''' + @Filename + ''' WITH (FIELDTERMINATOR = ''	'',ROWS_PER_BATCH = 50000,DATAFILETYPE=''widechar'')'
    
    result :
    Cannot bulk load because the file "\\192.168.50.08\In\U_20131118-160302592_3_1043.csv.upload" could not be opened. Operating system error code 5(Access is denied.).

    וכן הרשאות מלאות על התיקיה השיתופית (שנמצאת על שרת win 2008r2).

    איזה הרשאות חסרות אולי למשתמש בדומיין כדי לפתוח את הקובץ, או שמא שימוש רק במשתמש של SQL SERVER ייפתור את העניין?

    נ.ב. : העברתי את ה SQL SERVER לעבוד גם תחת אותו המשתמש בדומיין וגם זה לא עוזר.

    רעיונות?

    יום שני 18 נובמבר 2013 14:26

תשובות

  • היי פלג,

    אם יש לך הרשאות מתאימות, ניתן להשתמש ב- xp_cmdshell בצורה הבאה:

    USE master 
    GO 
    EXEC  sp_configure'Show Advanced Options',1;
    RECONFIGURE;
    exec sp_configure 'xp_cmdshell', 1
    RECONFIGURE;
    
    EXEC master..xp_cmdshell 'net use b: "\\192.168.50.08\In" password /user:domain\user'
    GO
    
    -- Your preferred method of bulk insert goes here:
    ------------------------------------
    
    
    ------------------------------------
    
    EXEC master..xp_cmdshell 'net use b: /DELETE'
    GO
    exec sp_configure 'xp_cmdshell', 0
    RECONFIGURE;
    EXEC  sp_configure'Show Advanced Options',0;
    RECONFIGURE;
    GO
    בהצלחה!


    • נערך על-ידי Ivan Radchenko יום חמישי 28 נובמבר 2013 06:46
    • הוצע כתשובה על-ידי Eran Sharvit שבת 07 דצמבר 2013 16:19
    • סומן כתשובה על-ידי Eran Sharvit יום ראשון 08 דצמבר 2013 13:45
    יום חמישי 28 נובמבר 2013 06:45
  • איבן, זה בהחלט רעיון נחמד לעקוף את הבעיה לחלוטין :-)

    אפשר גם להעתיק את הקובץ בצורה זו למחשב המקומי ולהמשיך לעבוד עליו מקומית

    * בהתבסס על הרעיון של איבן, אפשר גם להכין CLR קטן קבוע שיהיה בשרת ויפנה ישירות לשרת החיצוני. הייתרון שלא יהיה צריך לפתוח הרשאות כוללות לשימוש ב xp_cmdshell אלא רק להתקין קובץ סגור פעם אחת (באותה מידה אפשר להכין SP שעושה את העבודה). החיסרון הוא שכדי לפנות מה CLR לקובץ חיצוני יש לקמפל אותו במצב SAFE וזה אומר שה CLR בעצמו יכול להיות פריצת אבטחה, אם מרשים לכל אחד לשנות אותו. לכן במקרה זה צריך לדאוג שרק לאדמין יש הרשאות הקשורות אליו.

    כל זה כמובן בהנחה שבכלל אנחנו מצליחים לגשת לשרת המרוחק ב SHELL.


    [Personal Site] [Blog] [Facebook]signature

    • הוצע כתשובה על-ידי Eran Sharvit שבת 07 דצמבר 2013 16:19
    • סומן כתשובה על-ידי Eran Sharvit יום ראשון 08 דצמבר 2013 13:45
    יום חמישי 28 נובמבר 2013 10:08
    מנחה דיון

כל התגובות

  • שלום,

    טוב, השגיאה בגדול מסבירה שיש כאן בעיית הרשאות כלשהי.

    אני לא חושב שמדובר על הרשאה בדו 
    הייתי מתמקד יותר בהרשאות לתיקייה ולקובץ גם NTFS permissions  וגם Share permissions

    הבדיקה הכי פשוטה היא להתחבר עם המשתמש הייעודי לתיקייה המדוברת ולראות האם את מצליחה לגשת לתיקייה ולקובץ.
    יש לא מעט תקלות בדרך שיכולות לגרום לזה.

    לבדיקה מעמיקה יותר הייתי משתמש ב Process Monitor
    http://technet.microsoft.com/en-gb/sysinternals/bb896645.aspx

    מקווה שעזרתי,
    נועם

    יום שני 18 נובמבר 2013 16:27
  • את זה עשיתי : הייתי מתמקד יותר בהרשאות לתיקייה ולקובץ גם NTFS permissions  וגם Share permissions

    עם PROCESS MONITOR אני רואה שיש לי ACCESS DENIED

    Date & Time:	11/18/2013 5:07:49 PM
    Event Class:	File System
    Operation:	CreateFile
    Result:	ACCESS DENIED
    Path:	\\192.168.50.8\In\123.csv.upload
    TID:	4076
    Duration:	0.0031826
    Desired Access:	Generic Read
    Dis
    Options:	No Buffering, Non-Directory File, Open No Recall
    Attributes:	n/a
    ShareMode:	Read
    AllocationSize:	n/a
    Impersonating:	domainname\domainuser

    לא מצאתי עוד משהו שיעזור.

    ניסיתי לעבוד גם עם משתמש של SQL SERVER וגם זה לא עוזר.

    יום שני 18 נובמבר 2013 16:35
  • מה לגבי להתחבר עם המשתמש מאותו שרת לתקייה?

    האם יש לך גישה?

    יום שני 18 נובמבר 2013 16:56
  • מה הכוונה?

    אם אני מתחבר ל  SQL עם המשתמש מהדומיין ומריץ את ה BULK הוא עובד, ולכן לא ברור לי איפה הבעיה?

    יום שני 18 נובמבר 2013 16:58
  • אני אחדד...

    האם בגישה שלא דרך ה SQL  אתה מצליח לקרוא / לכתוב לקובץ בנתיב הנ"ל ?
    הבדיקה צריכה להיות עם המשתמש שמופיע לך ב Process monitor

    אגב, ניתן לראות מה Process monitor  שמדובר בהרשאה לכתיבה... (CreateFile)

    מקווה שעזרתי,
    נועם

    יום שני 18 נובמבר 2013 17:00
  • כן בוודאי אין לי בעיה לכתוב עם המשתמש

    עליו רצים כל ה SERVICES והם גם כותבים לדיסק וכדומה.

    ושוב כמו שאמרתי גם כשהרצתי תחת ה SQL עם המשתמש הזה את ה BULK הוא עובד ללא כל בעיה.

    לגבי ה PROCESS MONITOR לא ברור לי למה הוא מנסה לבצע CREATE FILE קודם

    יום שני 18 נובמבר 2013 18:15
  • אהלן

    הבעיה ברורה :-) אין למשתמש שניגש לקובץ הרשאות מתאימות

    1. אם אתה עובד עם משתמש דומיין עלייך לעבוד עם מסלול מתאים לתקייה המשותפת. למשל לעבוד עם הפקודה הבאה:

    BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail
       FROM '\\Your_Remote_computer_Name_Or_IP\Folderx\Foldery\File_Name.csv';
    GO

    שים לב שאת הקובץ יש לשים בתקייה שיתופית: במיקום

    \\Your_Remote_computer_Name_Or_IP\Folderx\Foldery\File_Name.csv

    2. אם אתה עובד תחת השראות של משתמש של ה SQL אז בזמן החיבור למחשב המרוחק נעשה שימוש במשתמש שמריץ את השירות של שרת ה SQL. אם המשתמש הזה הוא משתמש בדומיין אז אתה יכול לתת לו הרשאות מתאימות לתקיה והכל אמור לעבוד.

    אם השרת רץ תחת משתמש מקומי אז השרת המרוחק לא מכיר אותו :-) לכן זה לא יעבוד. אתה לא יכול לתת למשתמש מקומי הרשאות על השרת המרוחק שלא מכיר אותו.

    3. בתוך השאילתה עצמה (בפרט כשאתה עובד עם שאילתה דינאמית) אתה תמיד לבצע פעולה של impersonate (התחזות למשתמש אחר). זו אינה הדרך האידאלית במקרה הנוכחי אבל זו דרך שיכולה לעקוף בעיה נקודתית.
    http://msdn.microsoft.com/en-us/library/ms181362.aspx

    אני מקווה שזה ייתן את התשובה :-)


    [Personal Site] [Blog] [Facebook]signature

    • סומן כתשובה על-ידי Eran Sharvit יום חמישי 21 נובמבר 2013 10:31
    • סימון כתשובה בוטל על-ידי Eran Sharvit יום חמישי 21 נובמבר 2013 10:31
    יום שני 18 נובמבר 2013 19:15
    מנחה דיון
  • אני כבר עובד לפי  פתרון (1)

    אם תסתכל בקטע שהעתקתי מה PROCESS MONITOR אני רואה שיש כבר שימוש ב impersonate ולכן לא יכול להצביע איפה הבעיה בדיוק.

    יום שני 18 נובמבר 2013 19:28
  • כן אני רואה עכשיו את ההודעה השנייה, אני אנסה להתעמק בזה יותר מחר...

    * כדאי לעבוד בצורה ישירה ולא עם שאילתה דינאמית עד לסיום הניטור.

    * האם השם של הקובץ שלך הוא באמת 

    123.csv.upload

    ז"א השם מסתיים גם ב CSV וגם ב upload או שיש סיכוי שהתוספת היא טעות?

    * עוד רעיון בשלב זה: תנסה להפעיל במקביל את ה PROCESS MONITOR בשרת דרכו אתה ניגש וכן בשרת אליו אתה ניגש (נסה לאתר את הפעולות הקשורות ישירות לקובץ במסלול מקומי במקביל לקובץ במסלול הרשת). אולי זה יכוון למשהו.

    * זריקה באוויר: נשמע משהו שאולי קשור ל delegation settings. תבדוק אם הקישור הבא עוזר במשהו:

    http://msdn.microsoft.com/en-us/library/dd568720.aspx

    http://support.microsoft.com/kb/2443455

    לסיום כרגע...

    לגבי השאלה שלך מדוע יש פעולה של יצירה של קובץ: גם אם אני מריץ BULK INSERT על קובץ לא קיים אז מקבלים יצירה של קובץ. זה חלק ממה שגרם לי לחשוב שאולי שם הקובץ לא טוב. ראה תמונה כשאני סתם מנסה להריץ על קובץ לא קיים (ההודעה אחרת כי אין בעיה של הרשאות אבל כרגע זה רק לצורך התשובה ליצירת קובץ):


    [Personal Site] [Blog] [Facebook]signature

    יום שני 18 נובמבר 2013 20:59
    מנחה דיון
  • אני לא מבין עדין למה מה SSSMS זה עובד ללא בעיה.

    ב PROCESS MONITOR הוא מראה שהוא בכלל לא מבצע IMPERSONATE שיכול להיות שזה המקור לבעיה.

    יום שלישי 19 נובמבר 2013 09:21
  • פתרון ללא תלות בשמתמש בדומיין :
    1) שימוש בשמתמש שהוקם ב SQL
    2)מתן הרשאת EVERYONE
    סעיף (2) לא עוזר/לא משפיע לעניין המשתמש הדומייני והבעיה עבורו לא נפתרה
    יום רביעי 20 נובמבר 2013 17:48
  • היי

    לגבי ה CREATE FILE כתבתי לך למעלה וגם צירפתי תמונה לדוגמה
    גם אם תנסה לבצע BULK INSERT לקובץ לא קיים אז תקבל פעולה כזו

    לגבי למה כן ב SSMS ולא בצורה אחרת, זה ככל הנראה מפני שדרך ה SSMS אתה עובד עם המשתמש שאתה מחובר אליו, ובדרך אחרת אתה עובד עם משתמש שונה. צריך לוודא מי ולמה בעקרון.

    לגבי הבעיה עצמה עדיין אני לא מצליח להבין את כל המצב, אבל לא ממש התעמקתי בשרשור מספיק כניראה (לא קראתי הכל לעומק וקצת קשה לעקוב אחרי השרשור... הממשק לא מאפשר לדעת מי מגיב למי ולמה... יש הירארכיה רק של 3-4 תגובות ואחר כך כל התגובות מופיעות מיושרות באותו קו... ממשק מאוד גרוע אבל זה נושא אחר).

    * לא קיבלתי ממך תגובות על חלק ממה שרשמתי לפני כן וזה חשוב לניטור/הבנה שלי כדי להתקדם. ניטור הוא תהליך בשלבים ואני צריך להבין מה קורה (כרגע כאמור לא ברור לי עדיין המצב הבסיסי).

    אנא בדוק את מה שכתבתי למעלה.

    * אני לא בטוח שנוכל לנטר את הבעיה שלט רחוק ולא יהיה לי זמן מחר (אם אתה מגיע לפגישה של קבוצת ה SQL מחר ואתה יכול להתחבר ב RDP למחשב אז תוכל להראות לי את הבעיה אחרי הפגישה ואולי נגיע לפתרון מהיר או לרעיון)


    [Personal Site] [Blog] [Facebook]signature

    שבת 23 נובמבר 2013 15:52
    מנחה דיון
  • היי קודם כל תודה על המאמץ.

    לגבי ה CREATE FILE  אתה מקבל שגיאת NAME NOT FOUND בעוד אני מקבל ACCESS DENIED.

    לגבי ה DELEGATION, ניסיתי לסדר את זה, ובאחד המאמרים נטען שיש להגדיר SPN,הגדרתי

    http://technet.microsoft.com/en-us/library/bb735885.aspx

    לא עזר.

    ניסיתי גם PROCESS MONITOR בשרת היעד, שם נראה שהגישה היא ללא כל בעיה, והשגיאה על ACCESS DENIED מופיעה רק מהשרת הפונה - קרי שרת ה SQL.

    לצערי לא אוכל להגיע היום, אבל תודה על הניסיון לעזור.

    יום שני 25 נובמבר 2013 09:22
  • לגבי ה CREATE FILE זה היה רק כדי להראות לך שיש פעולה של כתיבת קובץ. ברור שהשיאה שונה :-) אין לי בעיות הרשאות, רציתי רק להסביר שיש פעולה של יצירת קובץ כאמור שנתפסת במוניטור (למה אני לא יודע).

    לבי ה PROCESS MONITOR התכוונתי שבזמן שעולה השגיאה הוא יופעל ב 2 המחשבים (המרוחק וזה שאליו פונים). ככה אפשר לראות מה נשלח ומה היע במקביל ולהצליב נתונים (לפעמים אפשר). כדאי עדיין לנסות אם עשית משהו אחר

    * למשל אולי תגלה את המשתמש האמיתי שמגיע בפניה לשרת המרוחק בדרך זו.

    * הפגישה היתה אתמול :-) לא היום
    היתה פגישה מעולה. הרצאה מעולה של איציק שלמדתי ממנה משהו חדש

    אני צריך את המצגת שלו כדי לעבור על משהו...
    אני מקווה שזה יועבר אלינו בקרוב

    חבל שאין הקלטה של הפגישות!


    [Personal Site] [Blog] [Facebook]signature

    יום שני 25 נובמבר 2013 15:52
    מנחה דיון
  • בשרת שעליו יושבים הקבצים לא מופיע בזמן השגיאה שום דבר ב PROCESS MONITOR

    רק כאשר כן מצליחים להגיע רואים שם SUCCESS על גישה לקובץ.

    יום שני 25 נובמבר 2013 17:01
  • בשרת שעליו יושבים הקבצים לא מופיע בזמן השגיאה שום דבר ב PROCESS MONITOR

    רק כאשר כן מצליחים להגיע רואים שם SUCCESS על גישה לקובץ.

    חייב להופיע משהו אם הנסיון להגיע אליו הצליח. גם נסיון של LOGIN לא מוצלח צריך להיתפס במוניטור למשל.

    צריך להיות כישלון להיתחברות או משהו כזה אחרת זה אומר שבכלל לא הגעת לשרת ולא שיש בעיה במשתמש שמנסה להתחבר (תיאורטית זו אפשרות שלא עלתה בדיון עד כה..)


    [Personal Site] [Blog] [Facebook]signature

    יום שני 25 נובמבר 2013 18:22
    מנחה דיון
  • היי פלג,

    אם יש לך הרשאות מתאימות, ניתן להשתמש ב- xp_cmdshell בצורה הבאה:

    USE master 
    GO 
    EXEC  sp_configure'Show Advanced Options',1;
    RECONFIGURE;
    exec sp_configure 'xp_cmdshell', 1
    RECONFIGURE;
    
    EXEC master..xp_cmdshell 'net use b: "\\192.168.50.08\In" password /user:domain\user'
    GO
    
    -- Your preferred method of bulk insert goes here:
    ------------------------------------
    
    
    ------------------------------------
    
    EXEC master..xp_cmdshell 'net use b: /DELETE'
    GO
    exec sp_configure 'xp_cmdshell', 0
    RECONFIGURE;
    EXEC  sp_configure'Show Advanced Options',0;
    RECONFIGURE;
    GO
    בהצלחה!


    • נערך על-ידי Ivan Radchenko יום חמישי 28 נובמבר 2013 06:46
    • הוצע כתשובה על-ידי Eran Sharvit שבת 07 דצמבר 2013 16:19
    • סומן כתשובה על-ידי Eran Sharvit יום ראשון 08 דצמבר 2013 13:45
    יום חמישי 28 נובמבר 2013 06:45
  • רעיון יפה, הבעיה שאין לי הרשאת xp_cmdshell.

    כמו כן אפשר לעשות NET USE גם ישירות מה CMD, אושאתה מציע בעצם לבצע NET USE בכל הרצה מחודשת של ה BULK ומחיקה בסוף?

    יום חמישי 28 נובמבר 2013 08:03
  • לא ניסיתי, אבל אני לא רואה שום בעיה, כל עוד יש לך כוח לבצע NET USE מה-cmd כל פעם. :)
    יום חמישי 28 נובמבר 2013 09:19
  • צריך הרשאת sysadmin/serveradmin לזה
    יום חמישי 28 נובמבר 2013 10:07
  • איבן, זה בהחלט רעיון נחמד לעקוף את הבעיה לחלוטין :-)

    אפשר גם להעתיק את הקובץ בצורה זו למחשב המקומי ולהמשיך לעבוד עליו מקומית

    * בהתבסס על הרעיון של איבן, אפשר גם להכין CLR קטן קבוע שיהיה בשרת ויפנה ישירות לשרת החיצוני. הייתרון שלא יהיה צריך לפתוח הרשאות כוללות לשימוש ב xp_cmdshell אלא רק להתקין קובץ סגור פעם אחת (באותה מידה אפשר להכין SP שעושה את העבודה). החיסרון הוא שכדי לפנות מה CLR לקובץ חיצוני יש לקמפל אותו במצב SAFE וזה אומר שה CLR בעצמו יכול להיות פריצת אבטחה, אם מרשים לכל אחד לשנות אותו. לכן במקרה זה צריך לדאוג שרק לאדמין יש הרשאות הקשורות אליו.

    כל זה כמובן בהנחה שבכלל אנחנו מצליחים לגשת לשרת המרוחק ב SHELL.


    [Personal Site] [Blog] [Facebook]signature

    • הוצע כתשובה על-ידי Eran Sharvit שבת 07 דצמבר 2013 16:19
    • סומן כתשובה על-ידי Eran Sharvit יום ראשון 08 דצמבר 2013 13:45
    יום חמישי 28 נובמבר 2013 10:08
    מנחה דיון
  • שלום,

    חברי הקהילה השקיעו מזמנם ונסיונם על מנת לסייע לך למצוא פתרון לבעייתך.

    לכן, אם אחת מן התשובות פתרה או עזרה לפתור את בעייתך, אנא סמן אותה על ידי לחיצה על "סמן כתשובה".

    אם מצאת פתרון אחר, נשמח אם תשתף אותנו על מנת שאחרים אשר מגיעים לפורום יוכלו להעזר בו.

    תודה,

    צוות הפורומים.

    מיקרוסופט מציעה שירות זה ללא תשלום, למטרת סיוע למשתמשים והעשרת הידע הקשור בטכנולוגיות ובמוצרים של מיקרוסופט. תוכן זה מתפרסם כפי שהוא והוא אינו מעיד על כל אחריות מצד מיקרוסופט.

    יום ראשון 01 דצמבר 2013 16:53
  • הפתרון שמצאתי לא עונה על הבעיה המקורית שלי מלכתחילה, ממשיך לבדוק את הנושא.

    יום ראשון 08 דצמבר 2013 07:22